Imported Upstream version 2.9 upstream/2.9
authorYoungbok Shin <youngb.shin@samsung.com>
Mon, 2 Apr 2018 10:41:11 +0000 (19:41 +0900)
committerYoungbok Shin <youngb.shin@samsung.com>
Mon, 2 Apr 2018 10:41:11 +0000 (19:41 +0900)
697 files changed:
CMakeLists.txt
ChangeLog
ChangeLog.20
ChangeLog.21
ChangeLog.22
ChangeLog.23
ChangeLog.24
ChangeLog.25
ChangeLog.26
ChangeLog.27 [new file with mode: 0644]
Jamfile
Jamrules
Makefile
README
README.git
autogen.sh
builds/amiga/README
builds/amiga/include/config/ftconfig.h
builds/amiga/include/config/ftmodule.h
builds/amiga/makefile
builds/amiga/makefile.os4
builds/amiga/smakefile
builds/amiga/src/base/ftdebug.c
builds/amiga/src/base/ftsystem.c
builds/ansi/ansi-def.mk
builds/ansi/ansi.mk
builds/beos/beos-def.mk
builds/beos/beos.mk
builds/beos/detect.mk
builds/cmake/iOS.cmake
builds/cmake/testbuild.sh
builds/compiler/ansi-cc.mk
builds/compiler/bcc-dev.mk
builds/compiler/bcc.mk
builds/compiler/emx.mk
builds/compiler/gcc-dev.mk
builds/compiler/gcc.mk
builds/compiler/intelc.mk
builds/compiler/unix-lcc.mk
builds/compiler/visualage.mk
builds/compiler/visualc.mk
builds/compiler/watcom.mk
builds/compiler/win-lcc.mk
builds/detect.mk
builds/dos/detect.mk
builds/dos/dos-def.mk
builds/dos/dos-emx.mk
builds/dos/dos-gcc.mk
builds/dos/dos-wat.mk
builds/exports.mk
builds/freetype.mk
builds/link_dos.mk
builds/link_std.mk
builds/mac/ftmac.c
builds/modules.mk
builds/os2/detect.mk
builds/os2/os2-def.mk
builds/os2/os2-dev.mk
builds/os2/os2-gcc.mk
builds/symbian/bld.inf
builds/symbian/freetype.mmp
builds/toplevel.mk
builds/unix/config.guess
builds/unix/config.sub
builds/unix/configure
builds/unix/configure.ac
builds/unix/configure.raw
builds/unix/detect.mk
builds/unix/freetype-config.in
builds/unix/freetype2.in
builds/unix/freetype2.m4
builds/unix/ft-munmap.m4
builds/unix/ftconfig.in
builds/unix/ftsystem.c
builds/unix/install.mk
builds/unix/unix-cc.in
builds/unix/unix-def.in
builds/unix/unix-dev.mk
builds/unix/unix-lcc.mk
builds/unix/unix.mk
builds/unix/unixddef.mk
builds/vms/ftconfig.h
builds/vms/ftsystem.c
builds/wince/ftdebug.c
builds/wince/vc2005-ce/freetype.vcproj
builds/wince/vc2005-ce/index.html
builds/wince/vc2008-ce/freetype.vcproj
builds/wince/vc2008-ce/index.html
builds/windows/detect.mk
builds/windows/ftdebug.c
builds/windows/ftver.rc [new file with mode: 0644]
builds/windows/vc2005/freetype.vcproj
builds/windows/vc2005/index.html
builds/windows/vc2008/freetype.vcproj
builds/windows/vc2008/index.html
builds/windows/vc2010/freetype.vcxproj
builds/windows/vc2010/freetype.vcxproj.filters
builds/windows/vc2010/index.html
builds/windows/visualc/freetype.dsp
builds/windows/visualc/freetype.vcproj
builds/windows/visualc/index.html
builds/windows/visualce/freetype.dsp
builds/windows/visualce/freetype.vcproj
builds/windows/visualce/index.html
builds/windows/w32-bcc.mk
builds/windows/w32-bccd.mk
builds/windows/w32-dev.mk
builds/windows/w32-gcc.mk
builds/windows/w32-icc.mk
builds/windows/w32-intl.mk
builds/windows/w32-lcc.mk
builds/windows/w32-mingw32.mk
builds/windows/w32-vcc.mk
builds/windows/w32-wat.mk
builds/windows/win32-def.mk
configure
devel/ft2build.h
devel/ftoption.h
docs/CHANGES
docs/CUSTOMIZE
docs/DEBUG
docs/FTL.TXT
docs/INSTALL
docs/INSTALL.ANY
docs/INSTALL.CROSS
docs/INSTALL.GNU
docs/INSTALL.UNIX
docs/INSTALL.VMS
docs/TODO
docs/VERSIONS.TXT
docs/formats.txt
docs/freetype-config.1
docs/raster.txt
docs/reference/ft2-auto_hinter.html
docs/reference/ft2-base_interface.html
docs/reference/ft2-basic_types.html
docs/reference/ft2-bdf_fonts.html
docs/reference/ft2-bitmap_handling.html
docs/reference/ft2-bzip2.html
docs/reference/ft2-cache_subsystem.html
docs/reference/ft2-cff_driver.html
docs/reference/ft2-cid_fonts.html
docs/reference/ft2-computations.html
docs/reference/ft2-error_code_values.html
docs/reference/ft2-error_enumerations.html
docs/reference/ft2-font_formats.html
docs/reference/ft2-gasp_table.html
docs/reference/ft2-glyph_management.html
docs/reference/ft2-glyph_stroker.html
docs/reference/ft2-glyph_variants.html
docs/reference/ft2-gx_validation.html
docs/reference/ft2-gzip.html
docs/reference/ft2-header_file_macros.html
docs/reference/ft2-header_inclusion.html
docs/reference/ft2-incremental.html
docs/reference/ft2-index.html
docs/reference/ft2-lcd_filtering.html
docs/reference/ft2-list_processing.html
docs/reference/ft2-lzw.html
docs/reference/ft2-mac_specific.html
docs/reference/ft2-module_management.html
docs/reference/ft2-multiple_masters.html
docs/reference/ft2-ot_validation.html
docs/reference/ft2-outline_processing.html
docs/reference/ft2-parameter_tags.html [new file with mode: 0644]
docs/reference/ft2-pcf_driver.html
docs/reference/ft2-pfr_fonts.html
docs/reference/ft2-properties.html [new file with mode: 0644]
docs/reference/ft2-quick_advance.html
docs/reference/ft2-raster.html
docs/reference/ft2-sfnt_names.html
docs/reference/ft2-sizes_management.html
docs/reference/ft2-system_interface.html
docs/reference/ft2-t1_cid_driver.html [new file with mode: 0644]
docs/reference/ft2-toc.html
docs/reference/ft2-truetype_engine.html
docs/reference/ft2-truetype_tables.html
docs/reference/ft2-tt_driver.html
docs/reference/ft2-type1_tables.html
docs/reference/ft2-user_allocation.html
docs/reference/ft2-version.html
docs/reference/ft2-winfnt_fonts.html
docs/release
include/freetype/config/ftconfig.h
include/freetype/config/ftheader.h
include/freetype/config/ftoption.h
include/freetype/config/ftstdlib.h
include/freetype/freetype.h
include/freetype/ftadvanc.h
include/freetype/ftautoh.h [deleted file]
include/freetype/ftbbox.h
include/freetype/ftbdf.h
include/freetype/ftbitmap.h
include/freetype/ftbzip2.h
include/freetype/ftcache.h
include/freetype/ftcffdrv.h [deleted file]
include/freetype/ftchapters.h
include/freetype/ftcid.h
include/freetype/ftdriver.h [new file with mode: 0644]
include/freetype/fterrdef.h
include/freetype/fterrors.h
include/freetype/ftfntfmt.h
include/freetype/ftgasp.h
include/freetype/ftglyph.h
include/freetype/ftgxval.h
include/freetype/ftgzip.h
include/freetype/ftimage.h
include/freetype/ftincrem.h
include/freetype/ftlcdfil.h
include/freetype/ftlist.h
include/freetype/ftlzw.h
include/freetype/ftmac.h
include/freetype/ftmm.h
include/freetype/ftmodapi.h
include/freetype/ftmoderr.h
include/freetype/ftotval.h
include/freetype/ftoutln.h
include/freetype/ftparams.h [new file with mode: 0644]
include/freetype/ftpcfdrv.h [deleted file]
include/freetype/ftpfr.h
include/freetype/ftrender.h
include/freetype/ftsizes.h
include/freetype/ftsnames.h
include/freetype/ftstroke.h
include/freetype/ftsynth.h
include/freetype/ftsystem.h
include/freetype/fttrigon.h
include/freetype/ftttdrv.h [deleted file]
include/freetype/fttypes.h
include/freetype/ftwinfnt.h
include/freetype/internal/autohint.h
include/freetype/internal/cffotypes.h [new file with mode: 0644]
include/freetype/internal/cfftypes.h [moved from src/cff/cfftypes.h with 98% similarity]
include/freetype/internal/ftcalc.h
include/freetype/internal/ftdebug.h
include/freetype/internal/ftdrv.h [moved from include/freetype/internal/ftdriver.h with 98% similarity]
include/freetype/internal/ftgloadr.h
include/freetype/internal/ftmemory.h
include/freetype/internal/ftobjs.h
include/freetype/internal/ftpic.h
include/freetype/internal/ftpsprop.h [new file with mode: 0644]
include/freetype/internal/ftrfork.h
include/freetype/internal/ftserv.h
include/freetype/internal/ftstream.h
include/freetype/internal/fttrace.h
include/freetype/internal/ftvalid.h
include/freetype/internal/internal.h
include/freetype/internal/psaux.h
include/freetype/internal/pshints.h
include/freetype/internal/services/svbdf.h
include/freetype/internal/services/svcfftl.h [new file with mode: 0644]
include/freetype/internal/services/svcid.h
include/freetype/internal/services/svfntfmt.h
include/freetype/internal/services/svgldict.h
include/freetype/internal/services/svgxval.h
include/freetype/internal/services/svkern.h
include/freetype/internal/services/svmetric.h
include/freetype/internal/services/svmm.h
include/freetype/internal/services/svotval.h
include/freetype/internal/services/svpfr.h
include/freetype/internal/services/svpostnm.h
include/freetype/internal/services/svprop.h
include/freetype/internal/services/svpscmap.h
include/freetype/internal/services/svpsinfo.h
include/freetype/internal/services/svsfnt.h
include/freetype/internal/services/svttcmap.h
include/freetype/internal/services/svtteng.h
include/freetype/internal/services/svttglyf.h
include/freetype/internal/services/svwinfnt.h
include/freetype/internal/sfnt.h
include/freetype/internal/t1types.h
include/freetype/internal/tttypes.h
include/freetype/t1tables.h
include/freetype/ttnameid.h
include/freetype/tttables.h
include/freetype/tttags.h
include/freetype/ttunpat.h [deleted file]
include/ft2build.h
modules.cfg
src/Jamfile
src/autofit/Jamfile
src/autofit/afangles.c
src/autofit/afblue.c
src/autofit/afblue.cin
src/autofit/afblue.dat
src/autofit/afblue.h
src/autofit/afblue.hin
src/autofit/afcjk.c
src/autofit/afcjk.h
src/autofit/afcover.h
src/autofit/afdummy.c
src/autofit/afdummy.h
src/autofit/aferrors.h
src/autofit/afglobal.c
src/autofit/afglobal.h
src/autofit/afhints.c
src/autofit/afhints.h
src/autofit/afindic.c
src/autofit/afindic.h
src/autofit/aflatin.c
src/autofit/aflatin.h
src/autofit/aflatin2.c
src/autofit/aflatin2.h
src/autofit/afloader.c
src/autofit/afloader.h
src/autofit/afmodule.c
src/autofit/afmodule.h
src/autofit/afpic.c
src/autofit/afpic.h
src/autofit/afranges.c
src/autofit/afranges.h
src/autofit/afscript.h
src/autofit/afshaper.c
src/autofit/afshaper.h
src/autofit/afstyles.h
src/autofit/aftypes.h
src/autofit/afwarp.c
src/autofit/afwarp.h
src/autofit/afwrtsys.h
src/autofit/autofit.c
src/autofit/module.mk
src/autofit/rules.mk
src/base/Jamfile
src/base/basepic.c
src/base/basepic.h
src/base/ftadvanc.c
src/base/ftapi.c
src/base/ftbase.c
src/base/ftbase.h
src/base/ftbbox.c
src/base/ftbdf.c
src/base/ftbitmap.c
src/base/ftcalc.c
src/base/ftcid.c
src/base/ftdbgmem.c
src/base/ftdebug.c
src/base/ftfntfmt.c
src/base/ftfstype.c
src/base/ftgasp.c
src/base/ftgloadr.c
src/base/ftglyph.c
src/base/ftgxval.c
src/base/ftinit.c
src/base/ftlcdfil.c
src/base/ftmac.c
src/base/ftmm.c
src/base/ftobjs.c
src/base/ftotval.c
src/base/ftoutln.c
src/base/ftpatent.c
src/base/ftpfr.c
src/base/ftpic.c
src/base/ftpsprop.c [new file with mode: 0644]
src/base/ftrfork.c
src/base/ftsnames.c
src/base/ftstream.c
src/base/ftstroke.c
src/base/ftsynth.c
src/base/ftsystem.c
src/base/fttrigon.c
src/base/fttype1.c
src/base/ftutil.c
src/base/ftwinfnt.c
src/base/rules.mk
src/bdf/Jamfile
src/bdf/README
src/bdf/bdfdrivr.c
src/bdf/bdflib.c
src/bzip2/Jamfile
src/bzip2/ftbzip2.c
src/bzip2/rules.mk
src/cache/Jamfile
src/cache/ftcache.c
src/cache/ftcbasic.c
src/cache/ftccache.c
src/cache/ftccache.h
src/cache/ftccback.h
src/cache/ftccmap.c
src/cache/ftcerror.h
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.c
src/cache/ftcmru.h
src/cache/ftcsbits.c
src/cache/ftcsbits.h
src/cache/rules.mk
src/cff/Jamfile
src/cff/cf2intrp.c [deleted file]
src/cff/cff.c
src/cff/cffcmap.c
src/cff/cffcmap.h
src/cff/cffdrivr.c
src/cff/cffdrivr.h
src/cff/cfferrs.h
src/cff/cffgload.c
src/cff/cffgload.h
src/cff/cffload.c
src/cff/cffload.h
src/cff/cffobjs.c
src/cff/cffobjs.h
src/cff/cffparse.c
src/cff/cffparse.h
src/cff/cffpic.c
src/cff/cffpic.h
src/cff/cfftoken.h
src/cff/module.mk
src/cff/rules.mk
src/cid/Jamfile
src/cid/ciderrs.h
src/cid/cidgload.c
src/cid/cidgload.h
src/cid/cidload.c
src/cid/cidload.h
src/cid/cidobjs.c
src/cid/cidobjs.h
src/cid/cidparse.c
src/cid/cidparse.h
src/cid/cidriver.c
src/cid/cidriver.h
src/cid/cidtoken.h
src/cid/module.mk
src/cid/rules.mk
src/cid/type1cid.c
src/gxvalid/Jamfile
src/gxvalid/README
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/gxvfeat.h
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
src/gxvalid/module.mk
src/gxvalid/rules.mk
src/gzip/Jamfile
src/gzip/ftgzip.c
src/gzip/rules.mk
src/lzw/Jamfile
src/lzw/ftlzw.c
src/lzw/ftzopen.c
src/lzw/ftzopen.h
src/lzw/rules.mk
src/otvalid/Jamfile
src/otvalid/module.mk
src/otvalid/otvalid.c
src/otvalid/otvalid.h
src/otvalid/otvbase.c
src/otvalid/otvcommn.c
src/otvalid/otvcommn.h
src/otvalid/otverror.h
src/otvalid/otvgdef.c
src/otvalid/otvgpos.c
src/otvalid/otvgpos.h
src/otvalid/otvgsub.c
src/otvalid/otvjstf.c
src/otvalid/otvmath.c
src/otvalid/otvmod.c
src/otvalid/otvmod.h
src/otvalid/rules.mk
src/pcf/Jamfile
src/pcf/README
src/pcf/pcfdrivr.c
src/pcf/pcfread.c
src/pfr/Jamfile
src/pfr/module.mk
src/pfr/pfr.c
src/pfr/pfrcmap.c
src/pfr/pfrcmap.h
src/pfr/pfrdrivr.c
src/pfr/pfrdrivr.h
src/pfr/pfrerror.h
src/pfr/pfrgload.c
src/pfr/pfrgload.h
src/pfr/pfrload.c
src/pfr/pfrload.h
src/pfr/pfrobjs.c
src/pfr/pfrobjs.h
src/pfr/pfrsbit.c
src/pfr/pfrsbit.h
src/pfr/pfrtypes.h
src/pfr/rules.mk
src/psaux/Jamfile
src/psaux/afmparse.c
src/psaux/afmparse.h
src/psaux/cffdecode.c [new file with mode: 0644]
src/psaux/cffdecode.h [new file with mode: 0644]
src/psaux/module.mk
src/psaux/psarrst.c [moved from src/cff/cf2arrst.c with 98% similarity]
src/psaux/psarrst.h [moved from src/cff/cf2arrst.h with 96% similarity]
src/psaux/psaux.c
src/psaux/psauxerr.h
src/psaux/psauxmod.c
src/psaux/psauxmod.h
src/psaux/psblues.c [moved from src/cff/cf2blues.c with 91% similarity]
src/psaux/psblues.h [moved from src/cff/cf2blues.h with 97% similarity]
src/psaux/psconv.c
src/psaux/psconv.h
src/psaux/pserror.c [moved from src/cff/cf2error.c with 96% similarity]
src/psaux/pserror.h [moved from src/cff/cf2error.h with 96% similarity]
src/psaux/psfixed.h [moved from src/cff/cf2fixed.h with 95% similarity]
src/psaux/psfont.c [moved from src/cff/cf2font.c with 91% similarity]
src/psaux/psfont.h [moved from src/cff/cf2font.h with 94% similarity]
src/psaux/psft.c [moved from src/cff/cf2ft.c with 65% similarity]
src/psaux/psft.h [moved from src/cff/cf2ft.h with 60% similarity]
src/psaux/psglue.h [moved from src/cff/cf2glue.h with 96% similarity]
src/psaux/pshints.c [moved from src/cff/cf2hints.c with 86% similarity]
src/psaux/pshints.h [moved from src/cff/cf2hints.h with 98% similarity]
src/psaux/psintrp.c [new file with mode: 0644]
src/psaux/psintrp.h [moved from src/cff/cf2intrp.h with 95% similarity]
src/psaux/psobjs.c
src/psaux/psobjs.h
src/psaux/psread.c [moved from src/cff/cf2read.c with 97% similarity]
src/psaux/psread.h [moved from src/cff/cf2read.h with 96% similarity]
src/psaux/psstack.c [moved from src/cff/cf2stack.c with 98% similarity]
src/psaux/psstack.h [moved from src/cff/cf2stack.h with 97% similarity]
src/psaux/pstypes.h [moved from src/cff/cf2types.h with 96% similarity]
src/psaux/rules.mk
src/psaux/t1cmap.c
src/psaux/t1cmap.h
src/psaux/t1decode.c
src/psaux/t1decode.h
src/pshinter/Jamfile
src/pshinter/module.mk
src/pshinter/pshalgo.c
src/pshinter/pshalgo.h
src/pshinter/pshglob.c
src/pshinter/pshglob.h
src/pshinter/pshinter.c
src/pshinter/pshmod.c
src/pshinter/pshmod.h
src/pshinter/pshnterr.h
src/pshinter/pshpic.c
src/pshinter/pshpic.h
src/pshinter/pshrec.c
src/pshinter/pshrec.h
src/pshinter/rules.mk
src/psnames/Jamfile
src/psnames/module.mk
src/psnames/psmodule.c
src/psnames/psmodule.h
src/psnames/psnamerr.h
src/psnames/psnames.c
src/psnames/pspic.c
src/psnames/pspic.h
src/psnames/pstables.h
src/psnames/rules.mk
src/raster/Jamfile
src/raster/ftmisc.h
src/raster/ftraster.c
src/raster/ftraster.h
src/raster/ftrend1.c
src/raster/ftrend1.h
src/raster/module.mk
src/raster/raster.c
src/raster/rasterrs.h
src/raster/rastpic.c
src/raster/rastpic.h
src/raster/rules.mk
src/sfnt/Jamfile
src/sfnt/module.mk
src/sfnt/pngshim.c
src/sfnt/pngshim.h
src/sfnt/rules.mk
src/sfnt/sfdriver.c
src/sfnt/sfdriver.h
src/sfnt/sferrors.h
src/sfnt/sfnt.c
src/sfnt/sfntpic.c
src/sfnt/sfntpic.h
src/sfnt/sfobjs.c
src/sfnt/sfobjs.h
src/sfnt/ttbdf.c
src/sfnt/ttbdf.h
src/sfnt/ttcmap.c
src/sfnt/ttcmap.h
src/sfnt/ttcmapc.h
src/sfnt/ttkern.c
src/sfnt/ttkern.h
src/sfnt/ttload.c
src/sfnt/ttload.h
src/sfnt/ttmtx.c
src/sfnt/ttmtx.h
src/sfnt/ttpost.c
src/sfnt/ttpost.h
src/sfnt/ttsbit.c
src/sfnt/ttsbit.h
src/smooth/Jamfile
src/smooth/ftgrays.c
src/smooth/ftgrays.h
src/smooth/ftsmerrs.h
src/smooth/ftsmooth.c
src/smooth/ftsmooth.h
src/smooth/ftspic.c
src/smooth/ftspic.h
src/smooth/module.mk
src/smooth/rules.mk
src/smooth/smooth.c
src/tools/afblue.pl
src/tools/docmaker/content.py
src/tools/docmaker/docmaker.py
src/tools/docmaker/formatter.py
src/tools/docmaker/sources.py
src/tools/docmaker/tohtml.py
src/tools/docmaker/utils.py
src/tools/ftfuzzer/README
src/tools/ftfuzzer/ftfuzzer.cc
src/tools/ftfuzzer/ftmutator.cc
src/tools/ftfuzzer/rasterfuzzer.cc
src/tools/ftfuzzer/runinput.cc
src/tools/glnames.py
src/tools/update-copyright-year
src/truetype/Jamfile
src/truetype/module.mk
src/truetype/rules.mk
src/truetype/truetype.c
src/truetype/ttdriver.c
src/truetype/ttdriver.h
src/truetype/tterrors.h
src/truetype/ttgload.c
src/truetype/ttgload.h
src/truetype/ttgxvar.c
src/truetype/ttgxvar.h
src/truetype/ttinterp.c
src/truetype/ttinterp.h
src/truetype/ttobjs.c
src/truetype/ttobjs.h
src/truetype/ttpic.c
src/truetype/ttpic.h
src/truetype/ttpload.c
src/truetype/ttpload.h
src/truetype/ttsubpix.c
src/truetype/ttsubpix.h
src/type1/Jamfile
src/type1/module.mk
src/type1/rules.mk
src/type1/t1afm.c
src/type1/t1afm.h
src/type1/t1driver.c
src/type1/t1driver.h
src/type1/t1errors.h
src/type1/t1gload.c
src/type1/t1gload.h
src/type1/t1load.c
src/type1/t1load.h
src/type1/t1objs.c
src/type1/t1objs.h
src/type1/t1parse.c
src/type1/t1parse.h
src/type1/t1tokens.h
src/type1/type1.c
src/type42/Jamfile
src/type42/module.mk
src/type42/rules.mk
src/type42/t42drivr.c
src/type42/t42drivr.h
src/type42/t42error.h
src/type42/t42objs.c
src/type42/t42objs.h
src/type42/t42parse.c
src/type42/t42parse.h
src/type42/t42types.h
src/type42/type42.c
src/winfonts/Jamfile
src/winfonts/fnterrs.h
src/winfonts/module.mk
src/winfonts/rules.mk
src/winfonts/winfnt.c
src/winfonts/winfnt.h
vms_make.com

index d1b053e..b0f8612 100644 (file)
@@ -1,6 +1,6 @@
 # CMakeLists.txt
 #
-# Copyright 2013-2017 by
+# Copyright 2013-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # Written originally by John Cary <cary@txcorp.com>
@@ -153,7 +153,7 @@ endif ()
 
 
 set(VERSION_MAJOR "2")
-set(VERSION_MINOR "8")
+set(VERSION_MINOR "9")
 set(VERSION_PATCH "0")
 
 set(PROJECT_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
@@ -331,7 +331,9 @@ if (BUILD_FRAMEWORK)
   )
 endif ()
 
-set(CMAKE_DEBUG_POSTFIX d)
+if (NOT DISABLE_FORCE_DEBUG_POSTFIX)
+  set(CMAKE_DEBUG_POSTFIX d)
+endif()
 
 add_library(freetype
   ${PUBLIC_HEADERS}
index b81af15..fa38730 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,13 +1,12 @@
-2017-05-13  Werner Lemberg  <wl@gnu.org>
+2018-01-08  Werner Lemberg  <wl@gnu.org>
 
-       * Version 2.8 released.
+       * Version 2.9 released.
        =======================
 
 
-       Tag sources with `VER-2-8'.
+       Tag sources with `VER-2-9'.
 
-       * docs/VERSION.TXT: Add entry for version 2.8.
-       * docs/CHANGES: Updated.
+       * docs/VERSION.TXT: Add entry for version 2.9.
 
        * README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
        builds/windows/vc2005/index.html,
        builds/windows/visualce/freetype.dsp,
        builds/windows/visualce/freetype.vcproj,
        builds/windows/visualce/index.html,
+       builds/windows/ftver.rc,
        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.7.1/2.8/, s/271/28/.
+       builds/wince/vc2008-ce/index.html: s/2.8.1/2.9/, s/281/29/.
 
-       * include/freetype/freetype.h (FREETYPE_MINOR): Set to 8.
+       * include/freetype/freetype.h (FREETYPE_MINOR): Set to 9.
        (FREETYPE_PATCH): Set to 0.
 
-       * builds/unix/configure.raw (version_info): Set to 20:0:14.
-       * CMakeLists.txt (VERSION_MINOR): Set to 8.
-       (VERSION_PATCH): Set to 0.
+       * builds/unix/configure.raw (version_info): Set to 22:0:16.
+       * CMakeLists.txt (VERSION_PATCH): Set to 1.
 
-2017-05-12  Hin-Tak Leung  <htl10@users.sourceforge.net>
+2018-01-07  Werner Lemberg  <wl@gnu.org>
 
-       Fix `FT_UINT_TO_POINTER' macro for Windows.
+       Add check for librt, needed for `ftbench' (#52824).
 
-       * builds/unix/ftconfig.in, builds/vms/ftconfig.h,
-       include/freetype/config/ftconfig.h (FT_UINT_TO_POINTER) [_WIN64]:
-       Fix definition.
+       * builds/unix/configure.raw (LIB_CLOCK_GETTIME): Define; this will
+       hold `-lrt' if necessary.
 
-2017-05-11  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       * builds/unix/unix-cc.in (LIB_CLOCK_GETTIME): New variable.
 
-       [autofit] Add support for Chakma script.
+2018-01-07  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/autofit/afblue.dat: Add blue zone data for Chakma.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       [psaux] Fix Type 1 glyphs with too many stem hints.
 
-       * src/autofit/afscript.h: Add Chakma standard character.
+       According to the CFF specification, charstrings can have up to 96 stem
+       hints. Due to hint replacement routines in Type 1 charstrings, some
+       glyphs are rejected by the Adobe engine, which implements the above
+       limit. This fix turns off hinting for such glyphs.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Chakma data.
+       * src/psaux/pshints.c (cf2_hintmap_build): Reset the error from calling
+       `cf2_hintmask_setAll' on a problematic Type 1 charstring and turn off
+       hinting.
 
-2017-05-10  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+2018-01-06  Werner Lemberg  <wl@gnu.org>
 
-       [autofit] Add support for Kayah Li script.
+       Add `FT_Done_MM_Var'.
 
-       * src/autofit/afblue.dat: Add blue zone data for Kayah Li.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       This is necessary in case the application's memory routines differ
+       from FreeType.  A typical example is a Python application on Windows
+       that calls FreeType compiled as a DLL via the `ctypes' interface.
 
-       * src/autofit/afscript.h: Add Kayah Li standard character.
+       * include/freetype/ftmm.h, src/base/ftmm.c (FT_Done_MM_Var): Declare
+       and define.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Kayah Li data.
+       * docs/CHANGES: Updated.
 
-2017-05-10  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+2018-01-03  Werner Lemberg  <wl@gnu.org>
 
-       [autofit] Add support for Bamum script.
+       [truetype] Round offsets of glyph components only if hinting is on.
 
-       * src/autofit/afblue.dat: Add blue zone data for Bamum.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       * src/truetype/ttgload.c (TT_Process_Composite_Component): Implement
+       it.
 
-       * src/autofit/afscript.h: Add Bamum standard character.
+2018-01-03  Werner Lemberg  <wl@gnu.org>
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Bamum data.
+       * src/truetype/ttgxvar.c (ft_var_to_design): Remove dead code.
 
-2017-05-10  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       This is a better fix than the previous commit, which is now
+       reverted.
 
-       [autofit] Add support for Saurashtra script.
+2018-01-03  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * src/autofit/afblue.dat: Add blue zone data for Saurashtra.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       Move internal LCD-related declarations.
 
-       * src/autofit/afscript.h: Add Saurashtra standard character.
+       * include/freetype/ftlcdfil.h (ft_lcd_padding, ft_lcd_filter_fir):
+       Move from here...
+       * include/freetype/internal/ftobjs.h: ... to here.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Saurashtra
-       data.
+2018-01-03  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-2017-05-10  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       * include/freetype/config/ftconfig.h (FT_EXPORT, FT_EXPORT_DEF)
+       [_MSC_VER]: Limit Visual C++ attributes.
 
-       [autofit] Add support for Buhid script.
+2018-01-03  Werner Lemberg  <wl@gnu.org>
 
-       * src/autofit/afblue.dat: Add blue zone data for Buhid.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       [truetype] Make blend/design coordinate round-tripping work.
 
-       * src/autofit/afscript.h: Add Buhid standard character.
+       Behdad reported that setting blend coordinates, then getting design
+       coordinates did incorrectly return the default instance's
+       coordinates.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Buhid data.
+       * src/truetype/ttgxvar.c (tt_set_mm_blend): Fix it.
 
-2017-05-08  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+2017-12-31  Werner Lemberg  <wl@gnu.org>
 
-       [autofit] Add support for Shavian script.
+       * src/sfnt/ttcmap.c (tt_cmap2_char_next): Fix endless loop.
 
-       * src/autofit/afblue.dat: Add blue zone data for Shavian.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       Reported as
 
-       * src/autofit/afscript.h: Add Shavian standard character.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4838
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Shavian data.
+2017-12-31  Werner Lemberg  <wl@gnu.org>
 
-2017-05-08  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       Synchronize other Windows project files.
 
-       [autofit] Add support for Vai script.
+       * builds/windows/*: Add missing files.
 
-       * src/autofit/afblue.dat: Add blue zone data for Vai.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+2017-12-31  Werner Lemberg  <wl@gnu.org>
 
-       * src/autofit/afscript.h: Add Vai standard character.
+       Update Visual C 2010 project files.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Vai data.
+       Problem reported by Hin-Tak.
 
-2017-05-08  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       * builds/windows/vc2010/freetype.vcxproj: Add files `ftbdf.c' and
+       `ftcid.c'.
+       Sort entries.
+       * builds/windows/vc2010/freetype.vcxproj.filter: Ditto.
+       Fix members of `FT_MODULE' group.
 
-       [autofit] Add support for Osmanya script.
+2017-12-30  Werner Lemberg  <wl@gnu.org>
 
-       * src/autofit/afblue.dat: Add blue zone data for Osmanya.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       * builds/vms/ftconfig.h: Synchronize with unix `ftconfig.in' file.
 
-       * src/autofit/afscript.h: Add Osmanya standard character.
+2017-12-28  Werner Lemberg  <wl@gnu.org>
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Osmanya data.
+       * builds/unix/ftconfig.in: Synchronize with main `ftconfig.h' file.
 
-2017-05-08  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       Reported by Nikolaus.
 
-       [autofit] Add support for Coptic script.
+2017-12-27  Werner Lemberg  <wl@gnu.org>
 
-       * src/autofit/afblue.dat: Add blue zone data for Coptic.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       Fix compiler warnings.
 
-       * src/autofit/afscript.h: Add Coptic standard character.
+       * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Make `pitch' and
+       `new_pitch' unsigned.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Coptic data.
+       * src/base/ftpsprop.c: Include FT_INTERNAL_POSTSCRIPT_PROPS_H.
 
-2017-05-08  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+2017-12-27  Werner Lemberg  <wl@gnu.org>
 
-       [autofit] Add support for Carian script.
+       Fixes for `make multi'.
 
-       * src/autofit/afblue.dat: Add blue zone data for Carian.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       * include/freetype/internal/ftpsprop.h: Use `FT_BASE_CALLBACK'.
+       (ps_property_get): Harmonize declaration with corresponding
+       function typedef.
 
-       * src/autofit/afscript.h: Add Carian standard character.
+       * include/freety[e/internal/fttrace.h: Add `trace_psprops'.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Carian data.
+       * src/base/ftpsprop.c: Include necessary header files.
+       (FT_COMPONENT): Define.
+       (ps_property_set): Tag with `FT_BASE_CALLBACK_DEF'.
+       (ps_property_get): Tag with `FT_BASE_CALLBACK_DEF'.
+       Harmonize declaration with corresponding function typedef.
 
-2017-05-07  Werner Lemberg  <wl@gnu.org>
+2017-12-27  Werner Lemberg  <wl@gnu.org>
 
-       [truetype] Add tricky font `DFGirl-W6-WIN-BF' (from Dynalab).
+       Provide support for intra-module callback functions.
 
-       Reported by Roy Tam <roytam@gmail.com>.
+       This is needed especially for `make multi' with C++.
 
-       * src/truetype/ttobjs.c (tt_check_trickyness_family): Implement it.
+       * include/freetype/config/ftconfig.h (FT_BASE_CALLBACK,
+       FT_BASE_CALLBACK_DEF): New macros.
 
-2017-05-07  Roy Tam  <roytam@gmail.com>
-           Werner Lemberg  <wl@gnu.org>
+2017-12-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       [truetype] More tricky fonts (mainly from Dynalab).
+       Move PostScript drivers' property handlers to `base'.
 
-       * src/truetype/ttobjs.c (tt_check_trickyness_family,
-       tt_check_trickyness_sfnt_ids): Add them.
+       This reduces the amount of duplicated code across PostScript
+       drivers.
 
-2017-05-07  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cffdrivr.c, src/cid/cidriver.c, src/type1/t1driver.c
+       ({cff,cid,t1}_property_{get,set}): Moved to...
+       * include/freetype/internal/ftpsprop.h: ...this new file.
+       (ps_property_{get,set}): New functions to replace moved ones.
 
-       [truetype] Add tricky font `DLCHayMedium' (from Dynalab).
+       * src/base/ftpsprop.c: New file that implements above functions.
 
-       Reported by Roy Tam <roytam@gmail.com>.
+       * include/freetype/internal/internal.h
+       (FT_INTERNAL_POSTSCRIPT_PROPS_H): New macro.
 
-       * src/truetype/ttobjs.c (tt_check_trickyness_family): Implement it.
+       * src/cff/cffdrivr.c, src/cid/cidriver.c, src/type1/t1driver.c:
+       Updated.
 
-2017-05-03  Werner Lemberg  <wl@gnu.org>
+       * src/base/Jamfile, src/base/rules.mk (BASE_SRC), src/base/ftbase.c:
+       Updated.
 
-       */*: s/backwards compatibility/backward compatibility/.
+2017-12-20  Werner Lemberg  <wl@gnu.org>
 
-2017-05-03  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       Speed up FT_Set_Var_{Design,Blend}_Coordinates if curr == new.
 
-       [autofit] Add support for Unified Canadian Syllabics script.
+       We exit early if the current design or blend coordinates are
+       identical to the new ones.
 
-       * src/autofit/afblue.dat: Add blue zone data for Unified Canadian
-       Syllabics.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       * src/truetype/ttgxvar.c (tt_set_mm_blend, TT_Set_Var_Design):
+       Implement it, returning internal error code -1 if there will be no
+       variation change.
 
-       * src/autofit/afscript.h: Add Unified Canadian Syllabics standard
-       character.
+       * src/type1/t1load.c (t1_set_mm_blend): Ditto.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Unified
-       Canadian Syllabics data.
+       * src/base/ftmm.c (FT_Set_Var_Design_Coordinates,
+       FT_Set_MM_Blend_Coordinates, FT_Set_Var_Blend_Coordinates): Updated.
 
-2017-05-03  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org>
+2017-12-18  Werner Lemberg  <wl@gnu.org>
 
-       [autofit] Add blue-zone support for Sundanese script.
+       [sfnt] Fix charmap type 2 iterator (#52646).
 
-       This essentially moves the Sundanese script from the `Indic' hinter
-       to the `Latin' hinter.
+       The subsetted demo font of the report that exhibits the bug has a
+       very unusual type 2 cmap for Unicode(!): It contains only two
+       sub-headers, one for one-byte characters (covering the range 0x20 to
+       0xFA), and a second one for higher byte 0x01 (just for character
+       code U+0131).
 
-       * src/autofit/afblue.dat: Add blue zone data for Sundanese.
+       Before this commit, the iterator wasn't able to correctly handle a
+       sub-header for higher byte 0x01.
 
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       * src/sfnt/ttcmap.c (tt_cmap2_char_next): Fix character increment
+       for outer loop.
 
-       * src/autofit/afscript.h: Add Sundanese standard character and move
-       data out of AF_CONFIG_OPTION_INDIC block.
+2017-12-18  Matthias Clasen  <matthias.clasen@gmail.com>
 
-       * src/autofit/afranges.c: Move Sundanese data out of
-       AF_CONFIG_OPTION_INDIC block.
+       [truetype] Fix clamping, minor tracing code beautification.
 
-       * src/autofit/afstyles.h: Update Sundanese data; in particular, use
-       AF_WRITING_SYSTEM_LATIN.
+       * src/truetype/ttgxvar.c (ft_var_to_normalized): Trace number of
+       design coordinates.
+       Use clamped value.
 
-2017-05-03  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+2017-12-18  Werner Lemberg  <wl@gnu.org>
 
-       [autofit] Add support for Avestan script.
+       * src/*/*: Only use `ft_' and `FT_' variants of stdc library stuff.
 
-       * src/autofit/afblue.dat: Add blue zone data for Avestan.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+2017-12-18  Werner Lemberg  <wl@gnu.org>
 
-       * src/autofit/afscript.h: Add Avestan standard character.
+       * src/truetype/ttgxvar.c (tt_face_vary_cvt): Add size guard (#52688).
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Avestan data.
+2017-12-18  Werner Lemberg  <wl@gnu.org>
 
-2017-05-02  Behdad Esfahbod  <behdad@behdad.org>
+       [truetype] Fix previous commit.
 
-       [truetype] Make `IUP' gvar deltas do the same as Apple (#50832).
+       * src/truetype/ttgload.c (TT_Process_Simple_Glyph): Correctly handle
+       unhinted phantom points, which must be properly scaled.
 
-       When points are not touched by gvar interpolation deltas, FreeType
-       gave a slightly different result than Apple's CoreText.
+2017-12-18  Werner Lemberg  <wl@gnu.org>
 
-       The OpenType working group will update the specification to document
-       the following behaviour: If the two points with deltas to the `left'
-       and `right' of the untouched point have the same coordinate, then
-       the inferred delta for the untouched point should be zero.
+       [truetype] Don't apply HVAR and VVAR deltas twice (#52683).
 
-       * src/truetype/ttgxvar.c (tt_delta_interpolate): Implement new
-       behaviour.
+       * src/truetype/ttgload.c (TT_Process_Simple_Glyph): Always adjust
+       `pp1' to `pp4', except if we have an HVAR and/or VVAR table.
 
-2017-05-02  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Handle
+       alternative code branch identically w.r.t. presence of an HVAR
+       and/or VVAR table.
 
-       [autofit] Remove `slight' auto-hint mode again.
+2017-12-17  Jonathan Kew  <jfkthame@gmail.com>
 
-       A poll on freetype-devel favoured changes directly applied to
-       `light'.
+       [truetype] Correctly handle variation font phantom points (#52683).
 
-       * include/freetype/freetype.h (FT_LOAD_TARGET_SLIGHT,
-       FT_RENDER_MODE_SLIGHT): Removed.
+       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Fix phantom
+       point indices.
 
-       * src/autofit/afcjk.c (af_cjk_hints_init), src/autofit/aflatin.c
-       (af_latin_hints_init), src/autofit/aflatin2.c
-       (af_latin2_hints_init): Revert change from 2017-04-22.
+2017-12-17  Jonathan Kew  <jfkthame@gmail.com>
 
-       * src/autofit/afloader.c (af_loader_load_glyph) Remove references to
-       FT_RENDER_MODE_SLIGHT.
-       [AF_CONFIG_OPTION_TT_SIZE_METRICS]: Enable TrueType-like metrics
-       unconditionally.
+       Fix incorrect advance width scaling (#52683).
 
-       * src/base/ftadvanc.c (LOAD_ADVANCE_FAST_CHECK): Revert change from
-       2017-04-22.
+       * src/base/ftadvance.c (FT_Get_Advances): Always respect the
+       FT_LOAD_NO_SCALE flag if present.
 
-       * src/base/ftobjs.c (FT_Load_Glyph): Revert change from 2017-04-22.
+2017-12-16  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * src/pshinter/pshalgo.c (ps_hints_apply): Revert change from
-       2017-04-22.
+       * builds/windows/vc2010/freetype.vcxproj: AfterBuild copy.
+       * objs/.gitignore: Ignore almost everything.
 
-       * src/smooth/ftsmooth.c (ft_smooth_render): Revert change from
-       2017-04-22.
+2017-12-11  Werner Lemberg  <wl@gnu.org>
 
-       * docs/CHANGES: Updated.
+       Fix compiler warning (#52640).
 
-2017-04-30  Werner Lemberg  <wl@gnu.org>
+       * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Remove unused
+       variable.
 
-       [autofit] Fix metrics computation.
+2017-12-08  Azzuro  <azzuro@team-mediaportal.com>
 
-       Problem reported by Markus Trippelsdorf <markus@trippelsdorf.de> and
-       Nikolaus Waxweiler <madigens@gmail.com>.
+       * builds/windows/vc2010/freetype.vcxproj: Adjust output directory.
 
-       * src/base/ftobjs.c (FT_Request_Size): Trigger recomputation of
-       auto-hinter metrics.  Without this change, multiple size changing
-       calls for a single face fail.
+       This allows builds with different configurations in parallel.
 
-2017-04-29  Werner Lemberg  <wl@gnu.org>
+2017-12-08  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttdriver.c (tt_size_request): Properly check `error'.
+       Fix `make setup dos', second try (#52622).
 
-       Reported by Earnestly <zibeon@googlemail.com> in
+       * builds/detect.mk (dos_setup): Don't use literal `>' character at
+       all.  Mixing the different escaping rules from make, dos, and
+       windows is too fragile.
 
-         http://lists.nongnu.org/archive/html/freetype/2017-04/msg00031.html
+2017-12-08  Werner Lemberg  <wl@gnu.org>
 
-2017-04-27  Werner Lemberg  <wl@gnu.org>
+       [docmaker] Fix code section parsing.
 
-       Introduce AF_CONFIG_OPTION_TT_SIZE_METRICS configuration option.
+       Stuff like
 
-       * include/freetype/config/ftoption.h
-       (AF_CONFIG_OPTION_TT_SIZE_METRICS): New option, commented out by
-       default.
+         {
+           <bla>
+         }
 
-       * src/autofit/afloader.c (af_loader_load_glyph): Use
-       AF_CONFIG_OPTION_TT_SIZE_METRICS to guard the corresponding code.
+       confused the parser, which incorrectly treated `<bla>' as a markup
+       tag.
 
-2017-04-26  Werner Lemberg  <wl@gnu.org>
+       * src/tools/docmaker/content.py (ContentProcessor::process_content):
+       Apply `re_markup_tags' only outside of code sections.
 
-       * include/freetype/freetype.h (FT_Render_Mode): Fix order.
+2017-12-08  Werner Lemberg  <wl@gnu.org>
 
-       This retains backward compatibility.
+       New `ftdriver.h' file, covering all driver modules.
 
-       Noted by Alexei.
+       This reduces redundancy and increases synergy; it also reduces the
+       number of header files.
 
-2017-04-22  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/config/ftheader.h (FT_DRIVER_H): New macro.
+       (FT_AUTOHINTER_H, FT_CFF_DRIVER_H, FT_TRUETYPE_DRIVER_H,
+       FT_PCF_DRIVER_H, FT_TYPE1_DRIVER_H): Make them aliases to
+       FT_DRIVER_H.
 
-       [truetype] Do linear scaling for FT_LOAD_NO_HINTING (#50470).
+       * include/freetype/ftautoh.h, include/freetype/ftcffdrv.h,
+       include/freetype/ftpcfdrv.h, include/freetype/ftt1drv.h,
+       include/freetype/ftttdrv.h: Replaced with...
+       * include/freetype/ftdriver.h: ...this new file.
+       (FT_CFF_HINTING_ADOBE, FT_T1_HINTING_ADOBE): Renamed to...
+       (FT_HINTING_ADOBE): ... this new macro.
+       (FT_CFF_HINTING_FREETYPE, FT_T1_HINTING_FREETYPE): Renamed to...
+       (FT_HINTING_FREETYPE): ... this new macro.
 
-       * src/truetype/ttobs.h (TT_SizeRec): Add field `hinted_metrics' to
-       hold hinted metrics.
-       Make `metrics' a pointer so that `tt_glyph_load' can easily switch
-       between metrics.
+       * src/*/*: Updated accordingly.
 
-       * src/truetype/ttdriver.c (tt_size_request): Updated.
-       (tt_glyph_load): Use top-level metrics if FT_LOAD_NO_HINTING is
-       used.
+2017-12-08  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttgload.c (TT_Hint_Glyph, TT_Process_Simple_Glyph,
-       TT_Process_Composite_Component, load_truetype_glyph,
-       compute_glyph_metrics, TT_Load_Glyph): Updated.
+       Move `ftdriver.h' to `ftdrv.h'.
 
-       * src/truetype/ttinterp.c (TT_Load_Context): Updated.
+       * include/freetype/internal/ftdriver.h: Renamed to...
+       * include/freetype/internal/ftdrv.h: ... this name.
 
-       * src/truetype/ttobjs.c (tt_size_reset): Updated.
+       * include/freetype/internal/internal.h (FT_INTERNAL_DRIVER_H):
+       Updated.
 
-       * src/truetype/ttsubpix.c (sph_set_tweaks): Updated.
+2017-12-08  Werner Lemberg  <wl@gnu.org>
 
-2017-04-22  Werner Lemberg  <wl@gnu.org>
+       Fix access to uninitalized memory (#52613).
 
-       Add new `slight' auto-hinting mode.
+       Also reported as
 
-       This mode uses fractional advance widths and doesn't scale glyphs
-       horizontally, only applying vertical scaling and hinting.
+         https://bugs.chromium.org/p/chromium/issues/detail?id=791317
 
-       At the same time, the behaviour of the `light' auto-hinter gets
-       restored for backward compatibility: Both vertical and horizontal
-       scaling is again based on rounded metrics values (this was changed
-       in a commit from 2017-03-30 as a side effect).  To be more precise,
-       the behaviour is restored for TrueType fonts only; for other font
-       formats like Type 1, this is a new feature of the `light' hinting
-       mode.
+       * src/base/ftbitmap.c (ft_bitmap_assure_buffer): If increasing the
+       bitmap size needs a larger bitmap buffer, assure that the new memory
+       areas are initialized also.
 
-       * include/freetype/freetype.h (FT_LOAD_TARGET_SLIGHT): New macro.
-       (FT_RENDER_MODE_SLIGHT): New render mode.
+2017-12-08  Werner Lemberg  <wl@gnu.org>
 
-       * include/freetype/internal/ftobjs.h (FT_Size_InternalRec): Add
-       `autohint_mode' and `autohint_metrics' fields.
+       Fix `make setup dos' (#52622).
 
-       * src/autofit/afcjk.c (af_cjk_hints_init), src/autofit/aflatin.c
-       (af_latin_hints_init), src/autofit/aflatin2 (af_latin2_hints_init):
-       Updated.
+       * builds/detect.mk (dos_setup): Properly escape literal `>'
+       character.
 
-       * src/autofit/afloader.c (af_loader_embolden_glyph_in_slot): Use
-       `autohint_metrics'.
-       (af_loader_load_glyph): s/internal/slot_internal/.
-       Initialize `autohint_metrics' and `autohint_mode' depending on
-       current auto-hint mode.
-       Use `autohint_metrics'.
-       Updated.
+2017-12-07  Werner Lemberg  <wl@gnu.org>
 
-       * src/base/ftadvanc.c (LOAD_ADVANCE_FAST_CHECK): Updated.
+       Fix C++ compilation.
 
-       * src/base/ftobjs.c (FT_Load_Glyph): Updated.
-       (FT_New_Size): Allocate `internal' object.
+       * src/psaux/psauxmod.h: Use FT_CALLBACK_TABLE macro where necessary.
 
-       * src/pshinter/pshalgo.c (ps_hints_apply): Updated.
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Fix warning.
 
-       * src/smooth/ftsmooth.c (ft_smooth_render): Updated.
+2017-12-07  Werner Lemberg  <wl@gnu.org>
 
-2017-04-22  Werner Lemberg  <wl@gnu.org>
+       Fix `make multi'.
 
-       Introduce `FT_Size_InternalRec' structure.
+       * include/freetype/internal/fttrace.h: Remove unused tracing macros.
+       s/pshalgo2/pshalgo/.
+       Add `trace_cffdecode'.
+       * src/pshinter/pshalgo.c (FT_COMPONENT): Updated.
 
-       We are going to extend this later on.
+       * src/cff/cffload.c: Include FT_INTERNAL_POSTSCRIPT_AUX_H.
+       * src/cff/cffobjs.c: Include FT_SERVICE_METRICS_VARIATIONS_H and
+       FT_SERVICE_CFF_TABLE_LOAD_H.
 
-       * include/freetype/internal/ftobjs.h (FT_Size_InternalRec): New
-       structure with a single field `module_data'.
+       * src/cid/cidriver.c: Include FT_INTERNAL_POSTSCRIPT_AUX_H.
 
-       * src/base/ftobjs.c (FT_New_Size): Allocate `internal' field of
-       `FT_Size' structure.
+       * src/psaux/cffdecode.c: Include FT_FREETYPE_H and
+       FT_INTERNAL_DEBUG_H.
+       (FT_COMPONENT): Define.
+       * src/psaux/cffdecode.h: Include FT_INTERNAL_POSTSCRIPT_AUX_H.
+       * src/psaux/psauxmod.h: Include FT_INTERNAL_POSTSCRIPT_AUX_H.
+       Declare `cff_builder_funcs' and `ps_builder_funcs'.
+       * src/psaux/psft.c: Include `psobjs.h' and `cffdecode.h'.
+       * src/psaux/psobjs.c : Include `psauxmod.h'.
 
-       * src/cff/cffgload.c (cff_builder_init, cff_decoder_prepare): Use
-       `size->internal->module_data' instead of `size->internal'.
+2017-12-07  Werner Lemberg  <wl@gnu.org>
 
-       * src/cff/cffobjs.c (cff_size_done): Deallocate `module_data'.
-       (cff_size_init, cff_size_select, cff_size_request): Use
-       `size->internal->module_data' instead of `size->internal'.
+       * include/freetype/config/ftheader.h: Some clean-up.
 
-       * src/cif/cidobjs.c (cid_size_done, cid_size_init,
-       cid_size_request): Use `size->internal->module_data' instead of
-       `size->internal'.
+       This commit removes documentation of deprecated macros and does some
+       minor streamlining.
 
-       * src/psaux/psobjs.c (t1_builder_ini): Use
-       `size->internal->module_data' instead of `size->internal'.
+2017-12-06  Werner Lemberg  <wl@gnu.org>
 
-       * src/type1/t1objs.c (T1_Size_Done, T1_Size_Init, T1_Size_Request):
-       Use `size->internal->module_data' instead of `size->internal'.
-
-2017-04-21  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       * builds/symbian/bld.inf: Updated.
 
-       * src/smooth/ftsmooth.h: Remove unused guards and declaration.
+2017-12-06  Werner Lemberg  <wl@gnu.org>
 
-2017-04-16  Hin-Tak Leung  <htl10@users.sourceforge.net>
+       New header file `ftparams.h' that collects all parameter tags.
 
-       Fix tracing messages.
+       * include/freetype/config/ftheader.h (FT_PARAMETER_TAGS_H): New
+       macro.
+       (FT_TRUETYPE_UNPATENTED_H, FT_UNPATENTED_HINTING_H): Define it to
+       `ftparams.h'.
 
-       * src/base/ftobjs.c (FT_Face_GetCharVariantIndex,
-       FT_Face_GetCharVariantIsDefault, FT_Face_GetVariantsOfChar): Print
-       correct function name.
+       * include/freetype/ftautoh.h, include/freetype/ftcffdrv.h,
+       include/freetype/ftincrem.h, include/freetype/ftlcdfil.h,
+       include/freetype/ftsnames.h, include/freetype/ftt1drv.h: Include
+       FT_PARAMETER_TAGS_H.
+       Move FT_PARAM_TAG_XXX definitions to...
+       * include/freetype/ftparams.h: ...this new file.
 
-2017-04-08  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       * include/freetype/ttunpat.h: Remove.  No longer needed.
 
-       [autofit] Add support for Old Turkic script.
+2017-12-05  Werner Lemberg  <wl@gnu.org>
 
-       * src/autofit/afblue.dat: Add blue zone data for Old Turkic.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       Improve tracing messages by using singular and plural forms.
 
-       * src/autofit/afscript.h: Add Old Turkic standard characters.
+       * src/*/*.c: Implement it.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Old Turkic data.
+2017-12-04  Werner Lemberg  <wl@gnu.org>
 
-2017-04-08  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       [truetype] Allow shared points in `cvar' table (#52532).
 
-       [autofit] Add support for Gothic script.
+       * src/truetype/ttgxvar.c (tt_face_vary_cvt): Implement it by copying
+       and adjusting the corresponding code from
+       `TT_Vary_Apply_Glyph_Deltas'.
 
-       * src/autofit/afblue.dat: Add blue zone data for Gothic.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+2017-11-28  Werner Lemberg  <wl@gnu.org>
 
-       * src/autofit/afscript.h: Add Gothic standard characters.
+       [truetype] Improving tracing of composite glyphs.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Gothic data.
+       * src/truetype/ttgload.c (TT_Load_Composite_Glyph)
+       [FT_DEBUG_LEVEL_TRACE]: Show composite glyph information.
 
-2017-04-08  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+2017-11-27  Werner Lemberg  <wl@gnu.org>
 
-       [autofit] Add support for Cypriot script.
+       [type1] Allow (again) `/Encoding' with >256 elements (#52464).
 
-       * src/autofit/afblue.dat: Add blue zone data for Cypriot.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       In version 2.6.1, this has been disallowed to better reject
+       malformed fonts; however, this restriction was too strong.  This
+       time, we only take the first 256 elements into account, since
+       encoding arrays are always accessed with a 8bit integer, according
+       to the PostScript Language Reference.
 
-       * src/autofit/afscript.h: Add Cypriot standard characters.
+       * src/type1/t1load.c (parse_encoding): Implement it.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Cypriot data.
+2017-11-27  Jan Alexander Steffens (heftig)  <jan.steffens@gmail.com>
 
-2017-04-08  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       Fix last commit (#52522).
 
-       [autofit] Add support for Deseret script.
+       * builds/freetype.mk: Set `FT_OPTION_H' and `FTOPTION_FLAG'
+       properly if we have `ftoption.h' in `BUILD_DIR'.
 
-       * src/autofit/afblue.dat: Add blue zone data for Deseret.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+2017-11-24  Werner Lemberg  <wl@gnu.org>
 
-       * src/autofit/afscript.h: Add Deseret standard characters.
+       [unix] Install a massaged `ftoption.h' file (#51780).
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Deseret data.
+       * builds/unix/configure.raw (ftoption_set, ftoption_unset): New
+       auxiliary functions to construct...
+       (FTOPTION_H_SED): ... this new variable.
+       Apply it as a sed argument while copying `ftoption.h' to the
+       `builds/unix' directory (using `AC_CONFIG_FILES').
+       Simplify code of test that checks cpp's computation of bit length
+       (the test previously created an empty `ftoption.h' file and deleted
+       it immediately afterwards); without this change, it can happen on my
+       GNU/Linux box that `configure's execution of `config.status' doesn't
+       create `ftoption.h' (no idea why this happens).
 
-2017-04-07  Werner Lemberg  <wl@gnu.org>
+       * builds/unix/install.mk (install): Install
+       `builds/unix/ftoption.h'.
 
-       [autofit] Fix invalid character range description (#50745).
+       * builds/unix/unix-def.in (DISTCLEAN): Updated.
 
-       Also reported as
+       * builds/unix/.gitignore: Updated.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1034
+2017-11-23  Tor Andersson  <tor.andersson@artifex.com>
 
-       * src/autofit/afranges.c (af_glag_nonbase_uniranges): Fix typo in
-       recent commit.
+       Silence unused function warnings (#52465).
 
-2017-04-07  Werner Lemberg  <wl@gnu.org>
+       Some static function declarations cause unused function warnings if
+       certain config options are turned off via `ftoption.h'.
 
-       [ftfuzzer] Fix clang warnings.
+       * src/base/ftbase.h, src/base/ftrfork.c, src/sfnt/ttbdf.h,
+       src/truetype/ttgxvar.h: Add #ifdef guards around these sections.
 
-       * src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Add
-       casts.
+2017-11-22  Ewald Hew  <ewaldhew@gmail.com>
 
-2017-04-06  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       * src/psaux/psft.c (cf2_setGlyphWidth): Check format before setting.
 
-       [autofit] Add support for Lisu script.
+       Reported as
 
-       * src/autofit/afblue.dat: Add blue zone data for Lisu.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=4377
 
-       * src/autofit/afscript.h: Add Lisu standard characters.
+2017-11-22  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Lisu data.
+       [psaux] Fix CFF advance widths. (#52466)
 
-2017-04-06  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       Glyph advance widths were being written to the new `PS_Decoder' but not
+       saved to the underlying format specific decoder. This caused pure CFF
+       fonts to have bad advance width.
 
-       [autofit] Add support for Osage script.
+       * include/freetype/internal/psaux.h (PS_Decoder): Change `glyph_width'
+       field to pointer.
+       Remove unused fields.
+       * src/psaux/psobjs.c (ps_decoder_init): Change `glyph_width' from copy
+       to reference.
+       Remove unused.
+       * src/psaux/psft.c (cf2_setGlyphWidth): Update code.
 
-       * src/autofit/afblue.dat: Add blue zone data for Osage.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+2017-11-15  Vlad Tsyrklevich  <vtsyrklevich@google.com>
 
-       * src/autofit/afscript.h: Add Osage standard characters.
+       * include/freetype/ftrender.h: Fix `FT_Renderer_RenderFunc' type.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Osage data.
+2017-11-14  Nikolaus Waxweiler  <madigens@gmail.com>
 
-2017-04-06  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       Use Adobe hinting engine for `light' hinting of both CFF and Type 1.
 
-       [autofit] Add support for Glagolitic script.
+       Since Ewald Hew factored the Adobe hinting engine out of the CFF
+       driver code, we can now use it on Type 1 (and CID) font formats, as
+       both have the same hinting philosophy.
 
-       * src/autofit/afblue.dat: Add blue zone data for Glagolitic.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       This change activates the Adobe hinter when in LIGHT mode, and
+       therefore always unless explicitly asking for the auto-hinter.  This
+       makes LIGHT behavior consistent with CFF fonts.  As of this commit,
+       the hinting engine table looks as follows.
 
-       * src/autofit/afscript.h: Add Glagolitic standard characters.
+                    LIGHT  NORMAL
+         -------------------------
+          TrueType  Auto   v40
+          CFF       Adobe  Adobe
+          Type 1    Adobe  Adobe
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Glagolitic data.
+2017-11-10  Yuri Levchenko  <yuri_levchenko@boolat.com>
 
-2017-04-06  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       * CMakeLists.txt: Add `DISABLE_FORCE_DEBUG_PREFIX' option.
 
-       [autofit] Add support for Tai Viet script.
+2017-11-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * src/autofit/afblue.dat: Add blue zone data for Tai Viet.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       * src/base/ftobjs.c (FT_Load_Glyph): Relocate condition.
 
-       * src/autofit/afscript.h: Add Tai Viet standard characters.
+2017-11-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Tai Viet data.
+       * src/smooth/ftgrays.c (gray_set_cell): Fix uninitialized variables.
 
-2017-04-06  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+2017-11-03  Ewald Hew  <ewaldhew@gmail.com>
 
-       [autofit] Add support for Tifinagh script.
+       [psaux] Fix PostScript interpreter rewinding in Type 1 mode. (#52251)
 
-       * src/autofit/afblue.dat: Add blue zone data for Tifinagh.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       The interpreter in Type 1 mode rewinds the charstring after collecting
+       all hints for building the initial hintmap (commit d52dd7f). However,
+       some charstrings use `endchar' in a final subroutine call, rewinding to
+       the start of that subroutine, and only a small section of the actual
+       glyph is drawn.
 
-       * src/autofit/afscript.h: Add Tifinagh standard characters.
+       * src/psaux/psintrp.c (cf2_interpT2CharString) <cf2_cmdENDCHAR>:
+       Ensure we are on the top level charstring before rewinding.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Tifinagh data.
+2017-11-03  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
-2017-04-06  Sascha Brawer  <sascha@google.com>
-           Werner Lemberg  <wl@gnu.org
+       [truetype] Add more tricky fonts.
 
-       [autofit] Add support for N'Ko script.
+       See the report by Yang Yinsen.
+       https://lists.gnu.org/archive/html/freetype-devel/2017-11/msg00000.html
 
-       * src/autofit/afblue.dat: Add blue zone data for N'Ko.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       * src/truetype/ttobjs.c (trick_names): Add `DFGothic-EB',
+       `DFGyoSho-Lt', `DFHSGothic-W5', `DFHSMincho-W3' and `DFHSMincho-W7'.
+       (tt_check_trickyness_sfnt_ids): Add checksums for DFGothic-EB,
+       DFGyoSho-Lt, DFHSGothic-W5, DFHSMincho-W3 and DFHSMincho-W7.  Also
+       add checksums for DLCLiShu and DLCHayBold which their family names
+       were already listed but their checksums were previously unknown.
 
-       * src/autofit/afscript.h: Add N'Ko standard characters.
+2017-11-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add N'Ko data.
+       [smooth] Fix complex rendering at high ppem.
 
-2017-04-06  Sascha Brawer  <sascha@google.com>
+       We used to split large glyphs into horizontal bands and continue
+       bisecting them still horizontally if that was not enough.  This is
+       guaranteed to fail when a single scanline cannot fit into the
+       rendering memory pool.  Now we bisect the bands vertically so that
+       the smallest unit is a column of the band height, which is guranteed
+       to fit into memory.
 
-       [autofit] Add support for Adlam script.
+       * src/smooth/ftgrays.c (gray_convert_glyph): Implement it.
 
-       * src/autofit/afblue.dat: Add blue zone data for Adlam.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+2017-10-20  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * src/autofit/afscript.h: Add Adlam standard characters.
+       [smooth] Improve complex rendering at high ppem.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Adlam data.
+       At large sizes almost but not exactly horizontal segments can quickly
+       drain the rendering pool. This patch at least avoids filling the pool
+       with trivial cells. Beyond this, we can only increase the pool size.
 
-2017-04-06  Sascha Brawer  <sascha@google.com>
+       Reported, analyzed, and tested by Colin Fahey.
 
-       [autofit] Add support for Ol Chiki script.
+       * src/smooth/ftgrays.c (gray_set_cell): Do not record trivial cells.
 
-       * src/autofit/afblue.dat: Add blue zone data for Ol Chiki.
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+2017-10-20  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * src/autofit/afscript.h: Add Ol Chiki standard character.
+       [base] Improve tracing in FT_Load_Glyph, FT_*_Size.
 
-       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Ol Chiki data.
+       * src/base/ftobjs.c (FT_Load_Glyph): Tag tracing messages with
+       function name, glyph index, and load flags.
+       (FT_Select_Metrics, FT_Request_Metrics): Remove all tracing.
+       (FT_Select_Size, FT_Request_Size): Improve tracing.
 
-2017-04-03  Werner Lemberg  <wl@gnu.org>
+2017-10-18  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       [truetype] Avoid reexecution of `fpgm' and `prep' in case of error.
+       [base] Improve tracing in FT_Render_Glyph.
 
-       Reported as
+       * src/base/ftobjs.c (FT_Render_Glyph_Internal): Add total coverage
+       calculations and downgrade Netpbm dump to bitmap:7.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=981
+2017-10-15  Ewald Hew  <ewaldhew@gmail.com>
 
-       * include/freetype/fterrdef.h (FT_Err_DEF_In_Glyf_Bytecode): New
-       error code.
+       [cff] Fix segfault on missing `psaux' (#52218)
 
-       * src/truetype/ttinterp.c (Ins_FDEF, Ins_IDEF): Prohibit execution
-       of these two opcodes in `glyf' bytecode.
-       (TT_RunIns): Don't enforce reexecution of `fpgm' and `prep' bytecode
-       in case of error since function tables can no longer be modified
-       (due to the changes in `Ins_FDEF' and `Ins_IDEF').  This change can
-       enormously speed up handling of broken fonts.
+       * src/cff/cffload.c (cff_done_blend): Add a check for possible nullptr.
 
-2017-04-02  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       * modules.cfg: Update dependency list.
 
-       [autofit] Disable metrics adjustment for `FT_LOAD_TARGET_LCD'.
+2017-10-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * src/autofit/aflatin.c (af_latin_hints_init): Updated.
-       * src/autofit/aflatin2.c (af_latin2_hints_init): Ditto.
+       [base, cff] Fix MSVC warnings.
 
-2017-04-01  Werner Lemberg  <wl@gnu.org>
+       * src/base/ftobjs.c (FT_New_Library): C4702: unreachable code.
+       (ft_glyphslot_preset_bitmap): C4244: possible loss of data.
+       * src/cff/cffload.c (cff_blend_doBlend): C4244: possible loss of data.
+       Turn `sum' into unsigned.
 
-       * src/truetype/ttgload.c: Include FT_CONFIG_CONFIG_H.
+2017-10-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       Otherwise FT_UINT_TO_POINTER might not be defined.
+       [base] Netpbm image tracing.
 
-       Problem reported by Alexei.
+       * src/base/ftobjs.c (FT_Load_Glyph): Trace bitmap size.
+       (FT_Render_Glyph_Internal): Trace bitmap in Netpbm format.
 
-2017-03-31  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       * src/smooth/ftgrays.c (gray_sweep): Sweep remnants of span tracing.
 
-       [autofit] Disable stem adjustment for `FT_LOAD_TARGET_LCD'.
+2017-10-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * include/freetype/freetype.h (FT_LOAD_TARGET_LCD): Document it.
-       * src/autofit/afcjk.c (af_cjk_hints_init): Updated.
-       * src/autofit/aflatin.c (af_latin_hints_init): Ditto.
-       * src/autofit/aflatin2.c (af_latin2_hints_init): Ditto.
+       * builds/windows/ftdebug.c (FT_Message): Print to stderr.
+       * builds/wince/ftdebug.c (FT_Message): Ditto.
 
-2017-03-31  Werner Lemberg  <wl@gnu.org>
+2017-10-14  Behdad Esfahbod  <behdad@behdad.org>
 
-       * src/cff/cffload.c (cff_font_load): Improve fix from 2017-01-04.
+       [afshaper] Delay creating `hb_set' objects until needed.
 
-       Allow CFFs containing a single font to have an empty font name.
+       In runs on Noto Naskh Arabic, this results in 89 sets created
+       instead of 340 before.  Makes auto-hinter setup with HarfBuzz
+       enabled 20% to 30% faster.
 
-       Problem reported by 張俊芝 <418092625@qq.com> in
+       * src/autofit/afshaper.c (af_shaper_get_coverage): Implement it.
 
-         http://lists.nongnu.org/archive/html/freetype-devel/2017-03/msg00074.html
+2017-10-12  Ewald Hew  <ewaldhew@gmail.com>
 
-2017-03-30  Werner Lemberg  <wl@gnu.org>
+       [type1, cid] Add hinting engine switch.
 
-       * src/cff/cffparse.h (CFF2_DEFAULT_STACK): Set to 513 also.
+       Implement property service in `type1' and `cid' drivers to allow
+       switching between FreeType or Adobe hinting engine when both are
+       available.
 
-       Requested by Dave Arnold.
+       * src/cid/cidriver.c (cid_property_{set,get}, cid_services),
+       src/type1/t1driver.c (t1_property_{set,get}, t1_services): Add
+       Properties service.
 
-2017-03-30  Werner Lemberg  <wl@gnu.org>
+       * src/cid/cidobjs.c (cid_driver_init), src/type1/t1objs.c
+       (T1_Driver_Init): Add default property values.
 
-       [truetype] Fix HVAR and VVAR handling (#50678).
+2017-10-12  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/truetype/ttgxvar.c (tt_hvadvance_adjust): Handle
-       glyph indices larger than `mapCount' as described in the
-       specification.
+       Add T1_CONFIG_OPTION_OLD_ENGINE configuration option.
 
-2017-03-30  Werner Lemberg  <wl@gnu.org>
+       This controls whether the old Type 1 engine gets compiled into FreeType.
+       It is disabled by default.
 
-       [truetype] Allow linear scaling for unhinted rendering (#50470).
+       * devel/ftoption.h, include/freetype/config/ftoption.h
+       (T1_CONFIG_OPTION_OLD_ENGINE): New macro.
 
-       * src/truetype/ttdriver.c (tt_size_request): Revert change from
-       2011-07-16; the intended metrics fix seems now to be implemented in
-       a different way, making the patch unnecessary.  Note that this
-       change was usually patched out by all major GNU/Linux distributions
-       due to heavy side effects.
+       * include/freetype/internal/psaux.h (PS_Decoder): Remove unused field.
+       * include/freetype/internal/psaux.h, src/cid/cidgload.c
+       (cid_load_glyph), src/psaux/psauxmod.c, src/psaux/psobjs.c
+       (ps_builder_add_point), src/psaux/t1decode.c
+       (t1_lookup_glyph_by_stdcharcode, t1_decoder_parse_glyph,
+       t1operator_seac, t1_decoder_parse_charstrings), src/psaux/t1decode.h,
+       src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Surround
+       relevant code with macro.
+       Minor code changes.
 
-       * src/truetype/ttgload.c (compute_glyph_metrics, TT_Load_Glyph):
-       Refer to the metrics of the `TT_Size' object.
+2017-10-12  Ewald Hew  <ewaldhew@gmail.com>
 
-2017-03-29  Werner Lemberg  <wl@gnu.org>
+       Extract width parsing from Type 1 parser.
 
-       [truetype] Fix thinko related to PS name of default named instance.
+       Duplicate the fast advance width calculations from the old parser.
+       This is to facilitate adding options for compiling out the old parser.
 
-       * src/truetype/ttgxvar.c (TT_Get_MM_Var): `strid' and `psid' are
-       name ID values, not indices into the array of name entries.
+       * src/psaux/t1decode.{c,h} (t1_decoder_parse_metrics): New function.
+       * include/freetype/internal/psaux.h (T1_Decoder_Funcs): New entry
+       `parse_metrics'.
+       * src/psaux/psauxmod.c: Set the new entry.
 
-2017-03-27  Werner Lemberg  <wl@gnu.org>
+       * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String),
+       src/cid/cidgload.c (cid_load_glyph): Separate
+       conditional for selecting engine.
 
-       [cid, truetype] Don't use `index' as a variable name.
+2017-10-09  Werner Lemberg  <wl@gnu.org>
 
-       At least on FreeBSD there is a global declaration of `index' in file
-       `/usr/include/strings.h'.
+       * src/base/ftoutln.c (FT_Outline_Translate): Fix integer overflow.
 
-       * src/cff/cf2intrp.c, src/truetype/ttgload.c: s/index/idx/ where
-       appropriate.
+       Reported as
 
-2017-03-27  Wojciech Mamrak  <wmamrak@gmail.com>
+         https://bugs.chromium.org/p/chromium/issues/detail?id=772775
 
-       [sfnt] Minor improvement for handling kern tables.
+2017-10-08  Werner Lemberg  <wl@gnu.org>
 
-       * src/sfnt/ttkern.c (tt_face_load_kern): Don't check for
-       cross-stream kerning tables since we reject format 2 tables later
-       on anyways.
-       Modify code for limit test...
-       (tt_face_get_kerning): ... to avoid a limit test here.
+       * src/base/ftobjs.c (ft_glyphslot_preset_bitmap): Integer overflows.
 
-2017-03-27  Werner Lemberg  <wl@gnu.org>
+       Reported as
 
-       [pcf] Fix compiler warnings.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3579
 
-       Reported by Alexander Hedges <ahedges@student.ethz.ch>.
+2017-10-07  Werner Lemberg  <wl@gnu.org>
 
-       * src/pcf/pcfdrivr.c (pcf_property_set, pcf_property_get): Tag
-       `property_name' with `FT_UNUSED' where necessary.
+       [sfnt] Adjust behaviour of PS font names for variation fonts.
 
-2017-03-26  Werner Lemberg  <wl@gnu.org>
+       * src/sfnt/sfdriver.c (sfnt_get_var_ps_name): Use a named instance's
+       PS name only if no variation is applied.
 
-       * src/psaux/psobjs.c (t1_builder_close_contour): Add safety guard.
+2017-10-07  Werner Lemberg  <wl@gnu.org>
 
-       Reported as
+       [cff, truetype] Adjust behaviour of named instances.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=941
+       This commit completely separates the interaction between named
+       instances and variation functions.  In particular, resetting the
+       variation returns to the current named instance (if set) and not to
+       the base font.
 
-2017-03-23  Werner Lemberg  <wl@gnu.org>
+       As a side effect, variation functions no longer change the named
+       instance index.
 
-       [psaux] Better protect `flex' handling.
+       * src/cff/cffobjs.c (cff_face_init): Use MM service's `set_instance'
+       function.
+       Also apply `MVAR' table to named instances.
 
-       Reported as
+       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Add cast.
+       (tt_set_mm_blend): No longer check whether requested variation
+       coincides with a named instance.
+       (TT_Set_Var_Design): Use current named instance for default
+       coordinates.
+       * src/truetype/ttobjs.c (tt_face_init): Use `TT_Set_Named_Instance'.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=935
+2017-10-07  Werner Lemberg  <wl@gnu.org>
 
-       * src/psaux/t1decode.c (t1_decoder_parse_charstrings)
-       <callothersubr>: Since there is not a single flex operator but a
-       series of subroutine calls, malformed fonts can call arbitrary other
-       operators after the start of a flex, possibly adding points.  For
-       this reason we have to check the available number of points before
-       inserting a point.
+       Make `FT_Set_Named_Instance' work.
 
-2017-03-23  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cffdrivr.c (cff_set_instance): New function.
+       (cff_service_multi_masters): Register it.
 
-       [sfnt] Fix check for default named instance.
+       * src/truetype/ttgxvar.c (TT_Set_Named_Instance): New function.
+       * src/truetype/ttgxvar.h: Updated.
+       * src/truetype/ttdriver.c (tt_service_gx_multi_masters): Register
+       it.
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): A `fixed' number needs four
-       bytes, not two...
+       * src/type1/t1load.c (T1_Reset_MM_Blend): New function.
+       * src/type1/t1load.h: Updated.
+       * src/type1/t1driver.c (t1_service_multi_masters): Register it.
 
-2017-03-23  Werner Lemberg  <wl@gnu.org>
+2017-10-07  Werner Lemberg  <wl@gnu.org>
 
-       Make MM fonts work (again).
+       Make `FT_FACE_FLAG_VARIATION' work.
 
-       * src/base/ftmm.c (FT_Set_Var_Design_Coordinates,
-       FT_Set_MM_Blend_Coordinates, FT_Set_Var_Blend_Coordinates): Ignore
-       return value of `ft_face_get_mvar_service'; instead, check whether a
-       service is actually returned.
+       * include/freetype/internal/tttypes.h (TT_Face): Remove
+       `is_default_instance'; this can be replaced with a combination of
+       `FT_IS_VARIATION' and `FT_IS_INSTANCE'.
 
-2017-03-20  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cffdrivr.c (cff_get_advances): Updated.
 
-       [truetype] Some variable renamings.
+       * src/sfnt/sfdriver.c (sfnt_get_ps_name), src/sfnt/sfobjs.c
+       (sfnt_init_face): Updated.
 
-       Too much local variables holding different structures were called
-       `metrics'.
+       * src/truetype/ttdriver.c (tt_get_advances), src/truetype/ttgload.c
+       (TT_Process_Simple_Glyph, load_truetype_glyph, IS_DEFAULT_INSTANCE),
+       src/truetype/ttgxvar.c (tt_set_mm_blend): Updated.
+       * src/truetype/ttgxvar.c (TT_Set_MM_Blend, TT_Set_Var_Design):
+       Handle `FT_FACE_FLAG_VARIATION'.
 
-       * src/truetype/ttdriver.c (tt_size_select): s/metrics/size_metrics/.
+       * src/type1/t1load.c (T1_Set_MM_Blend, T1_Set_MM_Design): Handle
+       `FT_FACE_FLAG_VARIATION'.
 
-       * src/truetype/ttgload.c (tt_get_metrics_incr_overrides,
-       compute_glyph_metrics): s/metrics/incr_metrics/.
-       (load_sbit_image): s/metrics/sbit_metrics/.
+2017-10-07  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttobjs.c (tt_size_run_fpgm): s/metrics/size_metrics/.
-       (tt_size_init_bytecode): s/metrics/tt_metrics/.
-       (tt_size_reset): s/metrics/size_metrics/.
+       New function `FT_Set_Named_Instance'.
 
-2017-03-20  Werner Lemberg  <wl@gnu.org>
+       No effect yet.
 
-       [sfnt] Don't add instances to non-variation fonts.
+       * src/base/ftmm.c (FT_Set_Named_Instance): New function.
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): Fix it.
+       * include/freetype/ftmm.h: Updated.
 
-2017-03-20  Werner Lemberg  <wl@gnu.org>
+2017-10-07  Werner Lemberg  <wl@gnu.org>
 
-       * src/cff/cffgload.c (cff_builder_init): Add safety guard (#50578).
+       Add macros for checking whether a font variation is active.
 
-2017-03-18  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/freetype.h (FT_FACE_FLAG_VARIATION,
+       FT_IS_VARIATION): New macros.
+       No effect yet.
 
-       Introduce FT_UINT_TO_POINTER macro (#50560).
+2017-10-07  Werner Lemberg  <wl@gnu.org>
 
-       We have to make a separate case for Windows 64's LLP64 data model.
+       Add framework for setting named instance in MM service.
 
-       * builds/unix/ftconfig.in, builds/vms/ftconfig.h,
-       include/freetype/config/ftconfig.h (FT_UINT_TO_POINTER): New macro.
+       * include/freetype/internal/services/svmm.h (FT_Set_Instance_Func):
+       New function typedef.
+       (MultiMasters): Add `set_instance' member.
+       (FT_DEFINE_SERVICE_MULTIMASTERSREC): Updated.
 
-       * src/truetype/ttgload.c (load_truetype_glyph): Use it.
+       * src/cff/cffdrivr.c (cff_service_multi_masters),
+       src/truetype/ttdriver (tt_service_gx_multi_masters),
+       src/type1/t1driver.c (t1_service_multi_masters): Updated.
 
-2017-03-18  Werner Lemberg  <wl@gnu.org>
+2017-10-07  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttinterp.c (TT_RunIns): Adjust loop counter (#50573).
+       [type1] Minor code shuffling.
 
-       The problematic font that exceeds the old limit is Lato-Regular,
-       version 2.007, containing bytecode generated by a buggy version of
-       ttfautohint.
+       * src/type1/t1load.c (T1_Set_MM_Blend): Make it a wrapper of...
+       (t1_set_mm_blend): ...this new function.
+       (T1_Set_MM_Design): Use `t1_set_mm_blend'.
 
-2017-03-18  Werner Lemberg  <wl@gnu.org>
+2017-10-05  Werner Lemberg  <wl@gnu.org>
 
-       [truetype] Another limitation for bytecode loop count maximum.
+       * src/base/ftobjs.c (ft_glyphslot_preset_bitmap): Fix integer
+       overflow.
 
        Reported as
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=900
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3539
 
-       * src/truetype/ttinterp.c (TT_RunIns): Limit `loopcall_counter_max'
-       by number of glyphs also.
+2017-10-05  Werner Lemberg  <wl@gnu.org>
 
-2017-03-18  Werner Lemberg  <wl@gnu.org>
+       Fix compiler warnings.
 
-       [ftfuzzer] Minor improvement.
+       * src/cff/cffdrivr.c (cff_ps_get_font_extra): Avoid code that relies
+       on numeric overflow.
+       Add cast.
 
-       * src/tools/ftfuzzer/ftfuzzer.cc: Don't set intermediate axis if
-       bitmap strikes are active.
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Fix variable
+       types, add cast.
 
-2017-03-18  Werner Lemberg  <wl@gnu.org>
+2017-10-04  John Tytgat  <John.Tytgat@esko.com>
 
-       Improve `make multi'.
+       [cff] Add support for `FSType'.
 
-       * src/autofit/aflatin2.c: Guard file with FT_OPTION_AUTOFIT2.
+       * include/freetype/internal/cfftypes.h (CFF_FontRec): Add
+       `font_extra' entry.
 
-       * src/base/ftmac.c: Guard more parts of the file with FT_MACINTOSH.
+       * src/cff/cffdrivr.c (cff_ps_get_font_extra): New function to
+       retrieve FSType info from the embedded PostScript data.
+       (cff_service_ps_info): Register function.
 
-       * src/psaux/afmparse.c: Guard file with T1_CONFIG_OPTION_NO_AFM.
+       * src/cff/cffload.c (cff_font_done): Free `font_extra'.
 
-       * src/sfnt/pngshim.c: Guard file with
-       TT_CONFIG_OPTION_EMBEDDED_BITMAPS also.
+2017-09-30  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * src/sfnt/ttbdf.c: Avoid empty source file.
-       * src/sfnt/ttpost.c: Guard file with
-       TT_CONFIG_OPTION_POSTSCRIPT_NAMES.
-       * src/sfnt/ttsbit.c: Guard file with
-       TT_CONFIG_OPTION_EMBEDDED_BITMAPS.
+       Signedness fixes in bitmap presetting.
 
-       * src/truetype/ttgxvar.c, src/truetype/ttinterp.c: Avoid empty
-       source file.
+       Reported as
 
-       * src/truetype/ttsubpix.c: Guard file with
-       TT_USE_BYTECODE_INTERPRETER also.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3514.
 
-       * src/type1/t1afm.c: Guard file with T1_CONFIG_OPTION_NO_AFM.
+       * src/raster/ftrend1.c (ft_raster1_render): Exlicitly signed height.
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Ditto.
+       * src/base/ftobjs.c (ft_glyphslot_preset_bitmap): Explicitly unsigned
+       subtraction.
 
-       * src/autofit/autofit.c, src/base/ftbase.c, src/cache/ftcache.c,
-       src/cff/cff.c, src/cid/type1cid.c, src/gxvalid/gxvalid.c,
-       src/pcf/pcf.c, src/pfr/pfr.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: Remove conditionals; sort
-       entries.
+2017-09-29  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-2017-03-17  Werner Lemberg  <wl@gnu.org>
+       Bitmap metrics presetting [2/2].
 
-       Fixes for conditional compilation.
+       * src/base/ftobjs.c (FT_Load_Glyph): Preset the bitmap metrics when
+       appropriate but `FT_Render_Glyph' is not called.
+       * include/freetype/freetype.h (FT_GlyphSlotRec): Document the change.
 
-       * src/autofit/afcjk.c, src/autofit/afindic.c: Include `afcjk.h'
-       earlier.
+2017-09-28  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): Put `memory' variable into
-       TT_CONFIG_OPTION_GX_VAR_SUPPORT block.
-       (sfnt_done_face): Protect some code with
-       TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+       [smooth, raster] Miscellaneous cleanups.
 
-       * src/sfnt/ttsbit.c (tt_face_load_sbix_image): Remove compiler
-       warning.
+       * src/raster/ftrend1.c (ft_raster1_render): Clean up the exit.
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Reduce
+       translations and clean up the exit.
+       (ft_smooth_render_lcd, ft_smooth_render_lcd): Remove unused `error'.
 
-       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Put `tmp' variable
-       into TT_USE_BYTECODE_INTERPRETER block.
+2017-09-28  Ben Wagner  <bungeman@google.com>
 
-       (tt_loader_init): Put `error' variable into
-       TT_USE_BYTECODE_INTERPRETER block.
+       [truetype] Really, really fix #52082.
 
-2017-03-17  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttinterp.c (Ins_MDRP): Correct conditional.
 
-       Fix preprocessor warning.
+2017-09-28  Werner Lemberg  <wl@gnu.org>
 
-       * devel/ftoption.h, include/freetype/config/ftoption.h: Test whether
-       TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined before checking its
-       value.
+       * src/psaux/psintrp.c (cf2_doStems): Fix integer overflow.
 
-2017-03-17  Werner Lemberg  <wl@gnu.org>
+       Reported as
 
-       `make multi' fixes; compiler warnings.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3510
 
-       * src/base/ftsnames.c: Include FT_INTERNAL_DEBUG_H.
+2017-09-28  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/cff/cffobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
-       FT_MULTIPLE_MASTERS_H and FT_SERVICE_MULTIPLE_MASTERS_H.
+       * src/cid/cidgload.c (cid_slot_load_glyph): Fix memory leak.
 
-       * src/sfnt/sfdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
-       FT_MULTIPLE_MASTERS_H and FT_SERVICE_MULTIPLE_MASTERS_H.
-       (get_win_string, get_apple_string): Initialize `result'.
+       Reported as
 
-2017-03-17  Dave Arnold <darnold@adobe.com>
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3489
 
-       [cff] Fix potential bugs in default NDV for CFF2.
+2017-09-28  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * src/cff/cffload.c (cff_blend_build_vector): Explicitly build blend
-       vector when `lenNDV' is zero; don't rely on zero-init.
-       Save `lenNDV' as part of cache key even when `lenNDV' is zero.
+       Bitmap metrics presetting [1/2].
 
-2017-03-17  Dave Arnold <darnold@adobe.com>
+       This mainly just extracts the code for presetting the bitmap metrics
+       from the monochrome, grayscale, and LCD renderers into a separate
+       function.
 
-       [cff] Fix CFF2 stack allocation.
+       * src/base/ftobjs.c (ft_glyphslot_preset_bitmap): New function that
+       calculates prospective bitmap metrics for the given rendering mode.
+       * include/freetype/internal/ftobjs.h (ft_glyphslot_preset_bitmap):
+       Declare it.
 
-       * src/cff/cffparse.c (cff_parser_init) add 1 for operator.
+       * src/base/ftlcdfil.c (ft_lcd_padding): New helper function that adds
+       padding to CBox taking into account pecularities of LCD rendering.
+       * include/freetype/ftlcdfil.h (ft_lcd_padding): Declare it.
 
-2017-03-16  Werner Lemberg  <wl@gnu.org>
+       * src/raster/ftrend1.c (ft_raster1_render): Reworked to use
+       `ft_glyphslot_preset_bitmap'.
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Ditto.
+       (ft_smooth_render_lcd, ft_smooth_render_lcd): The pixel_mode setting
+       is moved to `ft_glyphslot_preset_bitmap'.
 
-       * src/truetype/ttgxvar.c (tt_done_blend): Free `vvar_table'.
+2017-09-28  Ewald Hew  <ewaldhew@gmail.com>
 
-       Reported as
+       [psaux] Fix compiler warning.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=883
+       * src/psaux/pshints.c (cf2_hintmap_dump): Add switch for tracing
+       code.
 
-2017-03-15  Werner Lemberg  <wl@gnu.org>
+2017-09-27  Werner Lemberg  <wl@gnu.org>
 
-       Remove clang compiler warnings (#50548).
+       * src/sfnt/ttload.c (tt_face_load_font_dir): Fix compiler warning.
 
-       * include/freetype/internal/tttypes.h (TT_FaceRec): Make
-       `var_postscript_prefix_len' unsigned.
+2017-09-25  Werner Lemberg  <wl@gnu.org>
 
-       * src/autofit/afwarp.c (af_warper_compute_line_best): Remove
-       redundant assignment.
+       [psaux] Fix compiler warnings.
 
-       * src/cff/cffload.c (cff_subfont_load): Add casts.
+       * src/psaux/psft.c (cf2_initLocalRegionBuffer): Remove redundant
+       test.
 
-       * src/cff/cffparse.c (cff_parse_blend): Remove redundant assignment.
+       * src/psaux/psintrp.c (cf2_interpT2CharString)
+       <cf2_escCALLOTHERSUBR>: Add casts.
 
-       * src/sfnt/sfdriver.c (fmix32, murmur_hash_3_128): Add `static'
-       keyword.
-       Add casts.
-       (fixed2float): Add cast.
-       (sfnt_get_var_ps_name): Make `p' always initialized.
-       Add casts.
+       * src/psaux/psobjs.c (ps_decoder_init): Add cast.
 
-       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Add casts.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2017-03-15  Werner Lemberg  <wl@gnu.org>
+       [psaux] Minor fixes.
 
-       [ftfuzzer] Limit number of tested faces and instances.
+       * include/freetype/internal/psaux.h, src/psaux/psobjs.{c,h}:
+       Rearrange `ps_builder_init' arguments to conventional order.
 
-       This is inspired by the discussion in and analysis of
+       * src/psaux/psft.c (cf2_decoder_parse_charstrings): Add a check and
+       notice for `SubFont' in Type 1 mode.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=859
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Use only
-       up to 20 face indices.
-       Use only up to 20 instance indices.
+       [psaux] Move `psdecode' into `psobjs'.
 
-2017-03-15  Werner Lemberg  <wl@gnu.org>
+       As the former only contains a single procedure, move it into
+       `psobjs' for simplicity.  Also change the parameter order to the
+       conventional one.
 
-       * src/tools/ftfuzzer/ftfuzzer.cc: Improve readability; formatting.
+       * src/psaux/psdecode.c (ps_decoder_init): Moved to...
+       * src/psaux/psobjs.c: ...Here.
+       * src/psaux/psdecode.h, src/psaux/psobjs.h: Ditto.
 
-2017-03-14  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/internal/psaux.h (PSAux_ServiceRec): Update
+       `ps_decoder_init' function signature.
 
-       [sfnt] Implement PS names for font instances [3/3].
+       * src/cff/cffgload.c, src/cid/cidgload.c, src/type1/t1gload.c:
+       Update calls.
 
-       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+       * src/psaux/psaux.c, src/psaux/psauxmod.c: Update includes.
 
-       * include/freetype/internal/tttypes.h (TT_FaceRec): New fields
-       `var_postscript_prefix' and `var_postscript_prefix_len'.
+       * src/psaux/Jamfile (_sources), src/psaux/rules.mk (PSAUX_DRV_SRC):
+       Update file references.
 
-       * src/sfnt/sfdriver.c: Include FT_TRUETYPE_IDS_H.
-       (sfnt_is_alphanumeric): New wrapperfunction for `ft_isalnum'.
-       (get_win_string, get_apple_string): Remove `const' from return
-       value.
-       (MAX_VALUE_DESCRIPTOR_LEN, MAX_PS_NAME_LEN): New macros.
-       (hexdigits): New array.
-       (sfnt_get_var_ps_name): New function, implementing Adobe TechNote
-       5902 to construct a PS name for a variation font instance.
-       (sfnt_get_ps_name): Call `sfnt_get_var_ps_name' for font instances.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/sfnt/sfobjs.c (sfnt_done_face): Updated.
+       [psaux] Fix Type 1 hinting.
 
-       * src/truetype/ttgxvar.c (tt_set_mm_blend): Reset
-       `face->postscript_name' to trigger recalculation for new instance
-       parameters.
+       Type 1 hinting breaks sometimes when mid-charstring hints should
+       have been in the initial hintmap.  This fix adds a preprocessing
+       pass that reads all hints and builds the correct initial hintmap
+       first, before proceeding to build the glyph outline.
 
-2017-03-14  Werner Lemberg  <wl@gnu.org>
+       * src/psaux/psintrp.c (cf2_interpT2CharString): New
+       `initial_map_ready' boolean flag.
+       Ignore outline commands and hint changes on first pass.
+       <cf2_cmdENDCHAR>: Add section to build hintmap and rewind.
 
-       [sfnt] Implement PS names for font instances [2/3].
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/sfnt/sfdriver.c (fix2float) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
-       New function to find the shortest representation of a 16.16
-       fractional number.
+       [psaux] Add tracing for hints.
 
-2017-03-14  Werner Lemberg  <wl@gnu.org>
+       * src/psaux/pshints.c (cf2_hintmap_dump): New function.
+       (cf2_hintmap_insertHint): Trace incoming and inserted hints.
+       (cf2_hintmap_build): Dump hintmap before and after hint adjustment.
 
-       [sfnt] Implement PS names for font instances [1/3].
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       Add 128bit MurmurHash 3 function.
+       [psaux] Minor fixes.
 
-       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+       * src/psaux/psintrp.c (cf2_interpT2CharString): Fix check for pop
+       results.
+       s/font->decoder/decoder/ where necessary.
+       <cf2_cmdHSTEM, cf2_cmdVSTEM, cf2_escHSTEM3, cf2_escVSTEM3>: Use
+       offset parameter in `cf2_doStems' instead of doing correction for
+       left-sidebearing.
 
-       * src/sfnt/sfdriver.c (ROTL32): New macro.
-       (fmix32, murmur_hash_3_128): New functions.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2017-03-13  Werner Lemberg  <wl@gnu.org>
+       [cid] Use the new engine.
 
-       [truetype] Ignore invalid MVAR tags.
+       * src/cid/cidgload.c: Update includes.
+       (cid_load_glyph, cid_slot_load_glyph): Implement changes to glyph
+       loading code as with `type1' module.
 
-       Reported as
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=838
+       [cid] Add Adobe engine configuration.
 
-       * src/truetype/ttgxvar.c (ft_var_load_mvar): Ignore value and emit
-       warning for invalid tags.
-       (tt_apply_mvar): Ignore invalid tags.
+       This is similar to what was done in the `type1' module.
 
-2017-03-12  Werner Lemberg  <wl@gnu.org>
+       * src/cid/cidriver.c (t1cid_driver_class): Update declaration.
+       * src/cid/cidobjs.c: Include FT_TYPE1_DRIVER_H.
+       (cid_driver_init): Update code.
 
-       [truetype] Store and use design coordinates also.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       * include/freetype/internal/services/svmm.h (FT_Get_Var_Blend_Func):
-       Add `normalizedcoords' argument.
+       [psaux] Change subfont synthesis for CID fonts.
 
-       * src/truetype/ttgxvar.h (GX_BlendRec): Add `coords' field to store
-       the design coordinates of the current instance.
-       Updated.
+       Change `t1_make_subfont' to take in the Private dict record as an
+       argument.  This is because Type 1 and CID font records in FreeType
+       have this in different places.
 
-       * src/truetype/ttgxvar.c (TT_Set_MM_Blend): Move functionality to...
-       (tt_set_mm_blend): ... New function.
-       Convert data in `normalizedcoords' array to `coords' array on
-       demand.
-       (TT_Set_Var_Design): Store argument data in `coords' array.
-       (TT_Get_Var_Design): Get data from `coords' array.
-       (tt_get_var_blend): Updated.
-       (tt_done_blend): Updated.
+       * src/psaux/psobjs.c (t1_make_subfont): Change `T1_Face' to
+       `FT_Face' so that CID is also accepted.
+       Take `PS_Private' as an argument and let caller figure out where the
+       Private dict actually is.
+       Update references.
 
-       * src/cff/cffload.c, src/cff/cffload.h (cff_get_var_blend): Updated.
+       * include/freetype/internal/psaux.h, src/psaux/psobjs.h: Update
+       declaration.
 
-       * src/cff/cf2ft.c (cf2_getNormalizedVector): Updated.
+       * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Update
+       call.
 
-       * src/cff/cffobjs.c (cff_face_init): Updated.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2017-03-12  Werner Lemberg  <wl@gnu.org>
+       [type1] Switch to Adobe engine.
 
-       src/truetype/ttgxvar.[ch]: s/avar_checked/avar_loaded/.
+       * src/type1/t1objs.c (T1_Driver_Init): Set default to Adobe engine.
 
-2017-03-08  Werner Lemberg  <wl@gnu.org>
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       [sfnt] Another fix for buggy variation fonts.
+       [psaux] Extend Adobe interpreter (seac).
 
-       Reported as
+       This concludes the changes needed to add Type 1 support.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=759
+       * src/psaux/psintrp.c: Update includes.
+       (cf2_interpT2CharString) <cf2_escSEAC>: Implement this similarly to
+       implied seac for CFF.
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): While setting number of
-       instances to zero for `CFF' fonts table, ensure that there is no
-       `CFF2' present also (which gets priority).
+       * src/psaux/t1decode.c (t1_lookup_glyph_by_stdcharcode_ps): New
+       function to look up the glyph index.
 
-2017-03-07  Werner Lemberg  <wl@gnu.org>
+       * src/psaux/psft.c (cf2_getT1SeacComponent,
+       cf2_freeT1SeacComponent): New functions to get the charstrings for
+       seac components.
 
-       [sfnt] Improve handling for buggy variation fonts.
+       * src/psaux/t1decode.h, src/psaux/psft.h: Update declarations.
 
-       Reported as
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=738
+       [psaux] Extend Adobe interpreter (flex in callothersubr).
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): While setting number of
-       instances to zero for `CFF' fonts table, ensure that there is no
-       `glyf' table present also (which gets priority).
+       * src/psaux/psintrp.c (cf2_interpT2CharString)
+       <cf2_escCALLOTHERSUBR>: Fix Flex feature handling (OtherSubrs 0, 1,
+       2).
+       <cf2_cmdRMOVETO>: Do not actually move the `glyphPath' while doing
+       flex.  This is to avoid closing the current contour.
 
-2017-03-06  Werner Lemberg  <wl@gnu.org>
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       [sfnt, truetype] Always provide default instance.
+       [psaux] Extend Adobe interpreter (callothersubr).
 
-       As documented in the OpenType specification, an entry for the
-       default instance may be omitted in the named instance table.  In
-       particular this means that even if there is no named instance table
-       in the font we actually do have a named instance, namely the default
-       instance.
+       * src/psaux/psintrp.c (cf2_interpT2CharString)
+       <cf2_escCALLOTHERSUBR>: Copy code from
+       `t1_decoder_parse_charstrings' (in `t1decode.c').
+       OtherSubr 3 (change hints) should reset the hintmask, so that the
+       new hints are applied.
+       Fix function calls and stack access.
 
-       For consistency, we always want the default instance in our list of
-       named instances.  If it is missing, we try to synthesize it.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): Check whether the default
-       instance is in the table of named instances.  Otherwise adjust
-       number of instances.
+       [psaux] Extend Adobe interpreter (pop).
 
-       * src/truetype/ttgxvar.c: Include FT_TRUETYPE_IDS_H.
-       (TT_Get_MM_Var): Use `face->root.style_flags' as the number of named
-       instances.
-       Sythesize a named instance entry if necessary.
-       (tt_done_blend): Free `normalized_stylecoords'.
+       * src/psaux/psintrp.c (cf2_interpT2CharString): Change how unhandled
+       OtherSubr results are stored.  Implement the PostScript stack using
+       an array.
+       <cf2_escPOP>: Ensure that the stack is not cleared after getting
+       `OtherSubr' results.
+       Fix stack access.
 
-2017-03-05  Werner Lemberg  <wl@gnu.org>
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       [sfnt] Remove redundant code.
+       [psaux] Extend Adobe interpreter (callsubr).
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): Remove second test for
-       `num_instances', which will always succeed.
+       * src/psaux/psintrp.c (cf2_interpT2CharString) <cf2_cmdCALLSUBR>:
+       Type 1 mode.
 
-2017-03-04  Werner Lemberg  <wl@gnu.org>
+       * src/psaux/psft.c (cf2_initLocalRegionBuffer): Add Type 1 mode.
 
-       [sfnt] Add `get_name_id' service.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       * include/freetype/internal/sfnt.h (TT_Get_Name_ID_Func): New
-       typedef.
-       (SFNT_Interface): Add `get_name_id' field.
-       (FT_DEFINE_SFNT_INTERFACE): Updated.
+       [psaux] Extend Adobe interpreter (div, four-byte numbers).
 
-       * src/sfnt/sfdriver.c (search_name_id): Rename to...
-       (sfnt_get_name_id): ... this.
-       (sfnt_get_ps_name, sfnt_interface): Udpated.
+       * src/psaux/psintrp.c (cf2_interpT2CharString) <cf2_escDIV>: Add
+       Type 1 mode.  Type 1 requires large integers to be followed by
+       `div'; cf. `Adobe Type 1 Font Format', section 6.2.
+       <op == 255>: Push Type 1 four-byte numbers as `Int' always.  This is
+       to ensure `div' and `callsubr' get values they can use.
 
-2017-03-04  Werner Lemberg  <wl@gnu.org>
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       [truetype] Make `TT_Set_MM_Blend' set named instance index.
+       [psaux] Extend Adobe interpreter (hints).
 
-       * src/truetype/ttgxvar.h (GX_Blend): New array
-       `normalized_stylecoords'.
+       * src/psaux/psintrp.c (cf2_interpT2CharString) <cf2_cmdHSTEM,
+       cf2_cmdVSTEM>: Add correction for left sidebearing in Type 1 mode.
+       Allow adding hints mid-charstring.
+       <cf2_escVSTEM3, cf2_escHSTEM3>: Translate into equivalent commands
+       for three normal stem hints.  This requires some recalculation of
+       stem positions.
+       Correction for left sidebearing.
 
-       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Allocate and fill
-       `normalized_stylecoords'.
-       (TT_Set_MM_Blend): Check instance tuple and adjust `face_index'
-       accordingly.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2017-03-02  Werner Lemberg  <wl@gnu.org>
+       [psaux] Extend Adobe interpreter (hsbw, sbw).
 
-       [truetype] Split off designer/normalized conversion routines.
+       * src/psaux/psintrp.c (cf2_doStems): `hsbw' or `sbw' must be the
+       first operation in a Type 1 charstring.
+       (cf2_interpT2CharString): Remove unused variables.
+       <cf2_cmdHMOVETO, cf2_cmdVMOVETO, cf2_cmdRMOVETO>: `hsbw' or `sbw'
+       must be the first operation in a Type 1 charstring.
+       <cf2_cmdHSBW, cf2_escSBW>: Fix data access and add correction for
+       left sidebearing.
 
-       * src/truetype/ttgxvar.c (TT_Set_Var_Design): Split off conversion
-       code designer->normalized coordinates to...
-       (ft_var_to_normalized): ... New function.
-       (TT_Get_Var_Design): Split off conversion code normalized->designer
-       coordinates to...
-       (ft_var_to_design): ... New function.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2017-02-28  Werner Lemberg  <wl@gnu.org>
+       [psaux] Extend Adobe interpreter (setcurrentpoint).
 
-       [sfnt] Further generalize `sfnt_get_ps_name'; report invalid data.
+       * src/psaux/psintrp.c (cf2_interpT2CharString)
+       <cf2_escSETCURRENTPT>: Fix stack access.
 
-       * src/sfnt/sfdriver.c (sfnt_ps_map): New array.
-       (sfnt_is_postscript): New function.
-       (char_type_func): New typedef.
-       (get_win_string, get_apple_string): Add argument to specify
-       character checking function.
-       Add argument whether argument checking failures should be reported.
-       Update callers.
-       (search_name_id): Fix return value.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2017-02-23  Werner Lemberg  <wl@gnu.org>
+       [psaux] Extend Adobe interpreter (closepath).
 
-       [sfnt] Split off another bit of `sfnt_get_ps_name'.
+       * src/psaux/psintrp.c (cf2_interpT2CharString) <c2f_cmdCLOSEPATH>:
+       Use the right builder function.  We can use the `haveWidth' boolean
+       already present, instead of implementing `parse_state'.
 
-       * src/sfnt/sfdriver.c (sfnt_get_ps_name): Split off some
-       functionality into...
-       (search_name_id): ... New function.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-2017-02-23  Werner Lemberg  <wl@gnu.org>
+       [psaux] Add Type 1 operations to Adobe CFF interpreter.
 
-       [sfnt] Modularize `sfnt_get_ps_name'.
+       The following Type 1 specific ops have been added (copied from
+       `t1decode'):
 
-       * src/sfnt/sfdriver.c (sfnt_get_ps_name): Split off some
-       functionality into...
-       (IS_WIN, IS_APPLE): ... New macros.
-       (get_win_string, get_apple_string): ... New functions.
+         closepath
+         vstem3
+         hstem3
+         seac
+         sbw
+         callothersubr
+         pop
+         setcurrentpoint
+         hsbw
 
-2017-02-23  Werner Lemberg  <wl@gnu.org>
+       The following require a Type 1 mode, because of differences in
+       specification:
 
-       [truetype] Minor improvement.
+         hstem
+         vstem
+         vmoveto
+         callsubr
+         div
+         rmoveto
+         hmoveto
+         Numbers
 
-       * src/truetype/ttgload.c (TT_Process_Simple_Glyph,
-       load_truetype_glyph): Remove unnecessary tests.
+       The subsequent commits will implement these changes and adapt
+       accesses of data and objects to the new interpreter.
 
-2017-02-23  Werner Lemberg  <wl@gnu.org>
+       NOTE: Will not compile in the meantime!
 
-       * include/freetype/internal/tttypes.h (TT_Face): s/isCFF2/is_cff2/.
+       * src/psaux/psintrp.c: Add opcodes to enum.
+       (cf2_interpT2CharString): Copy relevant code over from
+       `t1_decoder_parse_charstrings' (in `t1decode.c').
 
-       For orthogonality with other structure field names.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       Update all users.
+       [type1] Fixes for rendering.
 
-2017-02-22  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       The Type 1 advance width calculation passes null for glyph slot,
+       etc, which can cause null pointer access in the new interpreter.
+       Fall back to the old one for now.
 
-       * src/smooth/ftgrays.c (gray_hline): Improve code.
+       Fix the large glyph retry code and ensure hinting and scaling flags
+       are set properly.
 
-2017-02-20  Dominik Röttsches  <drott@google.com>
+       * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Add a
+       check for metrics_only.
+       Set the `force_scaling' flag.
+       (T1_Parse_Glyph): Updated.
+       (T1_Load_Glyph): Add `hinting' and `scaled' flags.
 
-       Fix some `ttnameid.h' entries (#50313).
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       * include/freetype/ttnameid.h:
-       s/TT_MS_LANGID_SPANISH_INTERNATIONAL_SORT/TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT/,
-       s/TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIA/TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN/.
+       [psaux] Add missing objects (2/2).
 
-2017-02-20  Werner Lemberg  <wl@gnu.org>
+       Synthesize a `SubFont' object for Type 1 fonts.  This is used in the
+       interpreter to access Private dict data, which are stored in
+       different places for Type 1 and CFF.  This allows the same data to
+       be used in either mode.
 
-       [cff] Finish support for `random' operator.
+       * src/psaux/psobjs.c (t1_make_subfont): New procedure to copy
+       required values to a dummy `CFF_SubFont' object.  This is similar to
+       `cff_make_private_dict'.
+       * src/psaux/psobjs.h: Add the new declaration.
 
-       * src/cff/cfftypes.h (CFF_SubFontRec): Add `random' field.
+       * include/freetype/internal/psaux.h, src/psaux/psauxmod.c: Ditto.
+       Add this to the PSAux Service for future use with CID fonts.
 
-       * src/cff/cffobjs.c: Updated.
-       (cff_driver_init): Initialize random seed value.
+       * src/type1/t1gload.c: Include FT_INTERNAL_CFF_TYPES_H.
+       (T1_Parse_Glyph_And_Get_Char_String): Add the call.
 
-       * src/cff/cffload.c (cff_random): New function.
-       (cff_subfont_load): Add `face' argument.
-       Update all callers.
-       Initialize random number generator with a proper seed value.
-       (cff_font_load): Add `face' argument.
-       Update all callers.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/cff/cffload.h: Updated.
+       [psaux] Add missing objects for Type 1 (1/2).
 
-       * src/cff/cf2intrp.c (CF2_FIXME): Removed.
-       (cf2_interpT2CharString) <cf2_escRANDOM>: Implement opcode.
+       Move `CF2_Font' instance to `PS_Decoder'.  This is the context for
+       the interpreter and since it is currently stored in `CFF_Font', is
+       unavailable in Type 1 mode.
 
-       * src/cff/cffgload.c (cff_decoder_parse_charstrings): Don't
-       initialize random seed value.
-       <cff_op_random>: Use new random seed framework.
+       * include/freetype/internal/psaux.h (T1_Decoder, PS_Decoder): New
+       `cf2_instance' field.
 
-2017-02-20  Werner Lemberg  <wl@gnu.org>
+       * src/psaux/psdecode.c (ps_decoder_init): Copy `cf2_instance' to
+       `PS_Decoder'.
 
-       [cff] Sanitize `initialRandomSeed'.
+       * src/psaux/t1decode.c (t1_decoder_done): Add finalization code.
 
-       * src/cff/cffload.c (cff_load_private_dict): Make
-       `initial_random_seed' value always positive.
+       * src/psaux/psft.c (cf2_decoder_parse_charstrings): Update accesses.
 
-2017-02-20  Werner Lemberg  <wl@gnu.org>
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       [cff] Introduce `random-seed' property (2/2).
+       Allow `type1' module to use the Adobe engine.
 
-       * src/base/ftobjs.c: Include `FT_CFF_DRIVER_H'.
-       (open_face): Initialize `face->internal->random_seed'.
-       (FT_Face_Properties): Handle `FT_PARAM_TAG_RANDOM_SEED'.
+       Add the callback and some conditionals to switch between the two
+       engines.
 
-       * src/cff/cffdrivr.c (cff_property_set): Handle `random-seed'
-       property.
+       * include/freetype/internal/psaux.h (T1_Decoder_FuncsRec): Change
+       function declarations.
+       * src/psaux/psauxmod.c (T1_Decoder_FuncsRec): Register the
+       callbacks.
 
-2017-02-20  Werner Lemberg  <wl@gnu.org>
+       * src/psaux/psobjs.c (ps_builder_add_point): Add conditionals for
+       number conversion.
 
-       [cff] Introduce `random-seed' property (1/2).
+       * src/type1/t1gload.c (T1_Parse_Glyph_And_Get_Char_String): Add code
+       to choose which renderer to use.
 
-       We need this for support of the `random' operator.
+       * src/cid/cidgload.c (cid_load_glyph): Update call.
+       * src/base/ftobjs.c, src/psaux/psobjs.c, src/type1/t1gload.c: Update
+       includes.
 
-       * include/freetype/ftcffdrv.h (FT_PARAM_TAG_RANDOM_SEED): New macro.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): New
-       field `random_seed'.
+       [type1] Add Adobe engine configuration.
 
-       * src/cff/cffobjs.h (CFF_DriverRec): New field `random_seed'.
+       Use the previously changed PS_Driver in type1 module to store
+       hinting engine configuration.
 
-2017-02-17  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/ftt1drv.h: New file.
+       Duplicate and rename config options from CFF.
+       * include/freetype/config/ftheader.h (FT_TYPE1_DRIVER_H): New macro.
 
-       Remove clang warnings.
+       * src/type1/t1driver.c (t1_driver_class): Update declaration.
+       * src/type1/t1objs.c: Include FT_TYPE1_DRIVER_H.
+       (T1_Driver_Init): Update code.
 
-       * src/autofit/aflatin.c (af_latin_sort_blue): Add missing `static'
-       keyword.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/base/ftmm.c (FT_Set_Var_Design_Coordinates,
-       FT_Set_MM_Blend_Coordinates, FT_Set_Var_Blend_Coordinates):
-       Initialize some variables.
+       [cff] Move and rename `CFF_Driver'.
 
-2017-02-16  Nikolaus Waxweiler  <madigens@gmail.com>
-           Werner Lemberg  <wl@gnu.org>
+       This is so that we can use the same hinting engine parameters for
+       Type 1.
 
-       Add face property for stem darkening.
+       * include/freetype/internal/cffotypes.h (CFF_Driver): Rename and
+       move to...
+       * include/freetype/internal/psaux.h (PS_Driver): ...here.
 
-       * include/freetype/ftautoh.h (FT_PARAM_TAG_STEM_DARKENING): New
-       macro.
+       * src/cff/cffdrivr.c, src/cff/cffgload.c, src/cff/cffload.c,
+       src/cff/cffobjs.c, src/cff/cffobjs.h, src/psaux/psft.c,
+       src/psaux/psobjs.c: Update references.
 
-       * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Add
-       `no_stem_darkening' field.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/autofit/afloader.c (af_loader_load_glyph),
-       src/autofit/afmodule.c (af_property_set): Updated.
+       [psaux, type1] Reorganize object fields.
 
-       * src/base/ftobjs.c: Include FT_AUTOHINTER_H.
-       (ft_open_face_internal): Updated.
-       (FT_Face_Properties): Handle FT_PARAM_TAG_STEM_DARKENING.
+       Make some fields more generic, so that we can access them the same
+       way regardless of Type 1 or CFF.
 
-       * src/cff/cf2ft.c (cf2_decoder_parse_charstrings): Updated.
+       * include/freetype/internal/psaux.h (PS_Builder): Change `TT_Face'
+       to `FT_Face'.
+       Remove unused fields.
 
-       * src/cff/cffdrivr.c (cff_property_set): Updated.
+       * src/psaux/psft.c: Update all accesses of `PS_Builder.face'.
+       Add some asserts to guard against casting `T1_Face' as `TT_Face'.
 
-2017-02-16  Nikolaus Waxweiler  <madigens@gmail.com>
-           Werner Lemberg  <wl@gnu.org>
+       * src/type1/t1objs.h (T1_GlyphSlot): Reorder fields to follow
+       `CFF_GlyphSlot', so that we can pretend they are the same in the
+       interpreter.
 
-       Add face property for LCD filter weights.
+       * src/psaux/psobjs.c (ps_builder_init, ps_builder_add_point):
+       Updated with above changes.
 
-       * include/freetype/ftlcdfil.h (FT_PARAM_TAG_LCD_FILTER_WEIGHTS,
-       FT_LCD_FILTER_FIVE_TAPS): New macros.
-       (FT_LcdFiveTapFilter): New typedef.
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       * include/freetype/ftobjs.h (FT_Face_InternalRec)
-       [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Add `lcd_weights' field.
-       (FT_Bitmap_LcdFilterFunc): Change third argument to weights array.
-       (ft_lcd_filter_fir): New prototype.
-       (FT_LibraryRec): Updated.
+       [psaux] Prepare for Type 1 mode.
 
-       * src/base/ftlcdfil.c (_ft_lcd_filter_fir): Renamed to...
-       (ft_lcd_filter_fir): ... this base function.
-       Updated.
-       (_ft_lcd_filter_legacy): Updated.
-       (FT_Library_SetLcdFilterWeights, FT_Library_SetLcdFilter): Updated.
+       Add some checks for Type 1 data passing through.
 
-       * src/base/ftobjs.c (ft_open_face_internal): Updated.
-       (FT_Face_Properties): Handle FT_PARAM_TAG_LCD_FILTER_WEIGHTS.
+       * src/psaux/psfont.h (CF2_Font): Add `isT1' flag.
+       * src/psaux/psfont.c (cf2_font_setup): Skip the variations and blend
+       code which is not applicable for Type 1.
 
-       * src/smooth/ftsmooth.c (ft_smooth_render_generic)
-       [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Handle LCD weights from
-       `FT_Face_Internal'.
+       * src/psaux/psft.c (cf2_decoder_parse_charstrings): Avoid accessing
+       `decoder->cff' in Type 1 mode.
+       Copy `is_t1' flag to `CF2_Font'.
 
-2017-02-14  Nikolaus Waxweiler  <madigens@gmail.com>
-           Werner Lemberg  <wl@gnu.org>
+2017-09-25  Ewald Hew  <ewaldhew@gmail.com>
 
-       Add new function `FT_Face_Properties'.
+       [psaux, cff] Use the new objects.
 
-       This commit provides the framework, to be filled with something
-       useful in the next commits.
+       * include/freetype/internal/psaux.h, src/psaux/psauxmod.c: Fix
+       switching between new and old engines.
 
-       * include/freetype/freetype.h (FT_Face_Properties): Declare.
+       * src/cff/cffgload.c, src/cff/cffparse.c: Update calls.
 
-       * src/base/ftobjs.c (FT_Face_Properties): New function.
+       * src/psaux/psblues.c, src/psaux/psfont.c, src/psaux/psfont.h,
+       src/psaux/psft.c, src/psaux/psft.h, src/psaux/psintrp.c: Update all
+       to use new objects.
 
-2017-02-13  Werner Lemberg  <wl@gnu.org>
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-       [autofit] Prevent overlapping blue zones.
+       [psaux] Objects for new interpreter (part 2).
 
-       Problem reported as
+       Make the new objects copy over values.  They are essentially wrapper
+       types for the different decoders/builders.
 
-         https://github.com/google/fonts/issues/632
+       * include/freetype/internal/psaux.h: Update declarations.
+       (PS_Builder): Add `is_t1' flag.
+       (PS_Decoder_{Get,Free}_Glyph_Callback): Renamed to...
+       (CFF_Decoder_{Get,Free}_Glyph_Callback: ... this.
+       (PS_Decoder): Updated.
+       Add `t1_parse_callback' member.
+       (PSAux_ServiceRec): Add `ps_decoder_init' member.
 
-       The font in question (Nunito) has values 705 and 713 for the
-       reference and overshoot values, respectively, of the first blue
-       zone.  Blue zone 2, however, has value 710 for both the reference
-       and overshoot.  At 12ppem, reference and overshoot of blue zone 0
-       becomes 8px, while blue zone 2 becomes 9px.
+       * src/psaux/psdecode.h, src/psaux/psobjs.h: Update declarations.
 
-       A peculiarity of this font is that the tops of isolated vertical
-       stems like `N' have a slight overshoot also.  The auto-hinter tries
-       to find the nearest blue zone using the *original* coordinates.  For
-       vertical stems, this is value 713.  For normal horizontal tops like
-       in character `E', this is value 710.  Since value 713 is mapped to
-       8px but value 710 to 9px, `N' and similar characters are one pixel
-       higher than `E', which looks very bad.
+       * src/psaux/psdecode.c, src/psaux/psobjs.c: Implement copy with two
+       modes.
 
-       This commit sanitizes blue zones to avoid such a behaviour.
+       * src/psaux/psauxmod.c: Add builder and decoder functions to `PSAux'
+       service.
 
-       * src/autofit/aflatin.c (af_latin_sort_blue): New function.
-       (af_latin_metrics_init_blues): Sort blue values and remove overlaps.
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-2017-02-12  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       [psaux] Add objects for new interpreter.
 
-       * src/smooth/ftgrays.c (gray_sweep): Improve code.
+       Introduce `PS_Decoder' and `PS_Builder' which include all fields
+       from either Type 1 or CFF decoders/builders.
 
-2017-02-06  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/internal/psaux.h (PS_Builder, PS_Decoder): New
+       structs.
 
-       [truetype] Implement `VVAR' table support.
+       * src/psaux/psobjs.c, src/psaux/psobjs.h: Add `PS_Builder'
+       functions.
 
-       * src/truetype/ttgxvar.h (GX_HVarTable): Renamed to...
-       (GX_HVVarTable): ...This.
-       (GX_Blend): Add fields for `VVAR' table handling.
-       Other minor updates.
+       * src/psaux/psdecode.c, src/psaux/psdecode.h: New files to hold
+       `PS_Decoder' initialization functions.
 
-       * src/truetype/ttgxvar.c (ft_var_load_hvar): Renamed to...
-       (ft_var_load_hvvar): ...This.
-       Handle VVAR loading also (controlled by an additional parameter).
-       (tt_hadvance_adjust): Renamed to...
-       (tt_hvadvance_adjust): ...This.
-       Handle application of advance height also (controlled by an
-       additional parameter).
-       (tt_hadvance_adjust, tt_vadvance_adjust): Wrappers for
-       `tt_hvadvance_adjust'.
+       * src/psaux/psaux.c, src/psaux/Jamfile (_sources),
+       src/psaux/rules.mk (PSAUX_DRV_SRC): Updated.
 
-       * src/truetype/ttdriver.c (tt_service_metrics_variations): Updated.
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-2017-02-05  Werner Lemberg  <wl@gnu.org>
+       [psaux] Rename files.
 
-       [autofit] Use better blue zone characters for lowercase latin.
+       Replace the `cf2' file name prefix with `ps' as the Adobe engine
+       will be used for both PostScript Types 1 and 2 (CFF) instead of just
+       CFF.
 
-       The number of lowercase characters for computing the top flat blue
-       zone value was too small (in most cases only `x' and `z').  If one
-       of the two characters has a large serif, say, it can happen that
-       FreeType must select between two different values, having a 50%
-       chance to use the wrong one.  As a result, rendering at larger PPEM
-       values could yield uneven lowercase glyph heights.
+       s/cf2/ps/ for all following.
 
-       Problem reported by Christoph Koeberlin <christoph@koe.berlin>.
+       * src/psaux/cf2*: Rename files.
+       * src/psaux/*: Update includes.
 
-       * src/autofit/afblue.dat (AF_BLUE_STRING_LATIN_SMALL): Replaced
-       with...
-       (AF_BLUE_STRING_LATIN_SMALL_TOP, AF_BLUE_STRING_LATIN_SMALL_BOTTOM):
-       ... New, extended sets.
-       (AF_BLUE_STRINGSET_LATN): Updated.
+       * src/psaux/Jamfile (_sources), src/psaux/rules.mk (PSAUX_DRC_SRC,
+       PSAUX_DRV_H): Update file references.
 
-       * src/autofit/afblue.c, scr/autofit/afblue.h: Regenerated.
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-2017-02-04  Werner Lemberg  <wl@gnu.org>
+       [psaux] Minor fix.
 
-       Make `freetype-config' a wrapper of `pkg-config' if possible.
+       Use `MultiMasters' service in `psaux' instead of a call to `cff'.
+       The project builds if CFF_CONFIG_OPTION_OLD_ENGINE is not defined.
 
-       Based on ideas taken from
+       * src/psaux/cf2ft.c: Update includes.
+       (cf2_getNormalizedVector): Use `mm->get_var_blend' instead of
+       `cff_get_var_blend'.
 
-         http://pkgs.fedoraproject.org/cgit/rpms/freetype.git/tree/freetype-multilib.patch
-         http://pkgs.fedoraproject.org/cgit/rpms/freetype.git/tree/freetype-2.5.3-freetype-config-prefix.patch
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-       * builds/unix/freetype-config.in: Rewritten.  Use `pkg-config' to
-       set output variables if program is available.
+       [psaux, cff] Move `cff_random' into `psaux' service.
 
-       * docs/CHANGES, docs/freetype-config.1: Updated.
+       NOTE: Does not compile!
 
-2017-02-04  Werner Lemberg  <wl@gnu.org>
+       Minor fix to allow both `cff' and `psaux' to use `cff_random'.
 
-       * builds/unix/unix-def.in (freetype-config): Fix permissions.
+       * src/cff/cffload.c (cff_random): Move to...
+       * src/psaux/psobjs.c: Here.
+       * src/cff/cffload.h: Move corresponding declaration to
+       `src/psaux/psobjs.h'.
 
-2017-02-03  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/internal/psaux.h (PSAux_ServiceRec): Register the
+       function here...
+       * src/psaux/psauxmod.c: And here.
 
-       * src/autofit/afglobal.c (af_face_globals_free): Erase useless code.
+       * src/cff/cffload.c, src/psaux/cf2intrp.c: Update code.
 
-2017-02-03  Werner Lemberg  <wl@gnu.org>
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-       * include/freetype/ftgasp.h (FT_GASP_SYMMETRIC_GRIDFIT): Fix value.
+       [cff] Move struct declarations to `freetype/internal'.
 
-       Reported by Behdad.
+       NOTE: Does not compile!
 
-2017-02-02  Werner Lemberg  <wl@gnu.org>
+       This is so that the CFF functions moved to `psaux' can access the
+       same structs that they need.
 
-       [truetype] Fix MVAR post-action handling.
+       * src/cff/cfftypes.h: Moved to...
+       * include/freetype/internal/cfftypes.h: ...Here.
 
-       Reported as
+       * src/cff/cffobjs.h: Moved the struct declarations to...
+       * include/freetype/internal/cffotypes.h: ... this new file.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=509
+       * include/freetype/internal/internal.h (FT_INTERNAL_CFF_TYPES_H,
+       FT_INTERNAL_CFF_OBJECT_TYPES_H): New macros.
 
-       * src/truetype/ttobjs.c (tt_size_reset): Do nothing for CFF2.  This
-       is important to make `tt_size_reset_iterator' (called in
-       `tt_apply_mvar') always work.
+       * src/cff/cffcmap.h, src/cff/cffdrivr.c, src/cff/cffgload.c,
+       src/cff/cffgload.h, src/cff/cffload.h, src/cff/cffobjs.c,
+       src/cff/cffobjs.h, src/cff/cffparse.h, src/psaux/psobjs.h,
+       include/freetype/internal/psaux.h,
+       include/freetype/internal/services/svcfftl.h: Update includes.
 
-2017-02-02  Werner Lemberg  <wl@gnu.org>
+       * src/cff/rules.mk (CFF_DRV_H): Updated.
 
-       Make compilation with FT_CONFIG_OPTION_PIC work again.
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-       All code committed here is guarded with `FT_CONFIG_OPTION_PIC'.
+       [psaux, cff] Add new service for inter-module calls.
 
-       * include/freetype/internal/services/svmetric.h
-       (FT_DEFINE_SERVICE_METRICSVARIATIONSREC): Remove trailing semicolon.
+       NOTE: Does not compile!
 
-       * src/autofit/aflatin.c (af_latin_hints_compute_edges,
-       af_latin_hint_edges): Provide `globals' variable.
+       This is to allow CFF functions moved to `psaux' to call functions
+       declared in `src/cff/cffload.h'.
 
-       * src/autofit/afloader.c (af_loader_load_glyph): Remove shadowing
-       variable.
+       * include/freetype/internal/services/svcfftl.h: New file, setting up
+       a `CFFLoad' service.
 
-       * src/autofit/afmodule.c (AF_SCRIPT_CLASSES_GET,
-       AF_STYLE_CLASSES_GET): Redefine.
+       * include/freetype/internal/ftserv.h (FT_DEFINE_SERVICEDESCREC10,
+       FT_DEFINE_SERVICEDESCREC): New macros.
+       (FT_SERVICE_CFF_TABLE_LOAD_H): New macro.
 
-       * src/autofit/aftypes.h (AF_DEFINE_WRITING_SYSTEM_CLASS): Fix typo.
+       * src/cff/cffdrivr.c, src/cff/cffpic.h: Register the new service.
 
-       * src/cff/cffparse.c (CFF_FIELD_BLEND): Provide it.
+       * src/cff/cfftypes.h (CFF_FontRec), src/psaux/cf2font.h
+       (CF2_FontRec): Add service interface.
 
-       * src/cff/cffpic.h (CffModulePIC): Fix typo.
+       * src/cff/cffobjs.c, src/psaux/cf2font.c, src/psaux/cf2ft.c,
+       src/psaux/cf2intrp.c, src/psaux/cffdecode.c: Use the new service.
 
-2017-01-31  Alexei Podtelezhnikov  <apodtele@gmail.com>
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/smooth/ftgrays.c (gray_render_scanline): Improve code.
+       [psaux, cff] Add callbacks for inter-module calls.
 
-2017-01-31  Werner Lemberg  <wl@gnu.org>
+       NOTE: Does not compile!
 
-       [cff] Provide metrics variation service interface (#50196).
+       * include/freetype/internal/psaux.h: Add function pointer
+       declarations.
 
-       Only now I've got an OTF with an HVAR table for testing...
+       * src/psaux/cffdecode.c (cff_decoder_init): Update to take in
+       callbacks.
+       * src/psaux/cffdecode.h: Ditto.
 
-       The code in `ftmm.c' uses `FT_FACE_LOOKUP_SERVICE' to get the
-       metrics variations interface.  However, this didn't work with
-       `FT_FACE_FIND_GLOBAL_SERVICE' used in `sfnt_init_face'.
+       * src/cff/cffgload.c (cff_compute_max_advance, cff_slot_load):
+       Update calls to pass in callbacks.
+       * src/psaux/cf2ft.c, src/psaux/cffdecode.c: Use them.
 
-       * src/cff/cffdrivr.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
-       (cff_hadvance_adjust, cff_metrics_adjust): Wrapper functions for
-       metric service functions from the `truetype' module.
-       (cff_service_metrics_variations): New service.
-       (cff_services): Updated.
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/cff/cffpic.h (CFF_SERVICE_METRICS_VAR_GET): New macro.
-       [FT_CONFIG_OPTION_PIC]: Synchronize code.
+       [psaux, cff] Create new `PSAux' service interface entries.
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): Replace call to
-       FT_FACE_FIND_GLOBAL_SERVICE with `ft_module_get_service' to always
-       load the service from the `truetype' module.
+       NOTE: Does not compile!
 
-2017-01-31  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/internal/psaux.h: Include
+       FT_INTERNAL_TRUETYPE_TYPES_H.
+       (CFF_Builder_FuncsRec, CFF_Decocer_FuncsRec): New function tables.
+       (CFF_Builder): Updated.
+       Fix for forward declaration.
+       (PSAux_ServiceRec): New field `cff_decoder_funcs'.
 
-       Add framework to support services with 9 functions.
+       * src/psaux/psauxmod.c (cff_builder_funcs, cff_decoder_funcs): New
+       function tables.
+       (PSAux_Interface): Updated.
 
-       * include/freetype/internal/ftserv.h (FT_DEFINE_SERVICEDESCREC9):
-       New macro.
+       * include/freetype/internal/tttypes.h (TT_FaceRec): Add `psaux'
+       service interface.
 
-2017-01-31  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cffgload.c, src/cff/cffobjs.c, src/cff/cffparse.c: Update
+       function calls to use psaux service.
 
-       [base] Fix error handing in MM functions.
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/base/ftmm.c (FT_Set_Var_Design_Coordinates,
-       FT_Set_MM_Blend_Coordinates, FT_Set_Var_Blend_Coordinates):
-       Implement it.
+       [psaux, cff] Move CFF builder components into `psaux' module.
 
-2017-01-31  Werner Lemberg  <wl@gnu.org>
+       NOTE: Does not compile!
 
-       [truetype] Fix sanity check for `gvar' table (#50184).
+       * src/cff/cffgload.c
+       (cff_builder_{init,done,add_point,add_point1,add_contour,start_point,close_contour},
+       cff_check_points): Move to...
+       * src/psaux/psobjs.c: Here.
 
-       * src/truetype/ttgxvar.c (ft_var_load_gvar): There might be missing
-       variation data for some glyphs.
+       * src/cff/cffgload.h: Move corresponding declarations to
+       `src/psaux/psobjs.h'.
 
-2017-01-31  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cffgload.h (CFF_Builder): Move struct declaration to...
+       * include/freetype/internal/psaux.h: Here.
 
-       [autofit] Avoid uninitialized jumps (#50191).
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-       * src/autofit/afcjk.c (af_cjk_metrics_check_digits),
-       src/autofit/aflatin.c (af_latin_metrics_check_digits): Initialize
-       `advance'.
+       [psaux, cff] Move CFF decoder components into `psaux' module.
 
-2017-01-27  Werner Lemberg  <wl@gnu.org>
+       NOTE: Does not compile!
 
-       s/GB2312/PRC/.
+       * src/cff/cffgload.c (CFF_Operator,
+       CFF_COUNT_{CHECK_WIDTH,EXACT,CLEAR_STACK}, cff_argument_counts,
+       cff_operator_seac, cff_compute_bias,
+       cff_lookup_glyph_by_stdcharcode,
+       cff_decoder_{parse_charstrings,init,prepare}): Move to...
+       * src/psaux/cffdecode.c: This new file.
 
-       * include/freetype/freetype.h (FT_ENCODING_PRC): New enum value.
-       (FT_ENCODING_GB2312): Deprecated.
+       * src/cff/cffgload.h: Move corresponding declarations to...
+       * src/psaux/cffdecode.h: This new file.
 
-       * include/freetype/ttnameid.h (TT_MS_ID_PRC): New macro.
-       (TT_MS_ID_GB2312): Deprecated.
+       * src/cff/cffgload.h (CFF_MAX_{OPERANDS,SUBRS_CALLS,TRANS_ELEMENTS},
+       CFF_Decoder_Zone, CFF_Decoder): Move declarations to...
+       * include/freetype/internal/psaux.h: Here.
 
-       * src/sfnt/sfobjs.c (sfnt_find_encoding): Updated.
+       * src/psaux/cf2ft.h: Update include.
 
-       * docs/CHANGES: Updated.
+       * src/psaux/psaux.c, src/psaux/rules.mk (PSAUX_DRV_SRC): Update with
+       the new file.
 
-2017-01-26  Werner Lemberg  <wl@gnu.org>
+2017-09-24  Ewald Hew  <ewaldhew@gmail.com>
 
-       [base] Add `FT_Get_Sfnt_LangTag' function.
+       [psaux, cff] Move Adobe's engine components into `psaux' module.
 
-       * include/freetype/ftsnames.h (FT_SfntLangTag): New structure.
-       (FT_Get_Sfnt_LangTag): New declaration.
+       This is the first patch of a sequence to move the Type 2 charstring
+       processing capability from the `cff' module to the `psaux' module.
 
-       * src/base/ftsnames.c (FT_Get_Sfnt_LangTag): New funtion.
+       NOTE: Does not compile!
 
-       * docs/CHANGES: Updated.
+       * src/cff/cf2*: Move these files to...
+       * src/psaux/cf2*: Here.
 
-2017-01-26  Werner Lemberg  <wl@gnu.org>
+       * src/cff/Jamfile (_sources), src/cff/rules.mk (CFF_DRV_SRC,
+       CFF_DRV_H), src/cff/cff.c, src/cff/cffgload.c: Remove file
+       references.
 
-       [sfnt] Support `name' table format 1.
+       * src/psaux/Jamfile (_sources), src/psaux/rules.mk, src/psaux/psaux.c
+       (PSAUX_DRV_SRC, PSAUX_DRV_H): Add file references.
 
-       * include/freetype/internal/tttypes.h (TT_LangTagRec): New
-       structure.
-       (TT_NameTableRec): Add fields `numLangTagRecords' and `langTags'.
+2017-09-24  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * src/sfnt/ttload.c (tt_face_load_name): Add support for language
-       tags.
-       Reduce array size of name strings in case of invalid entries.
-       (tt_face_free_name): Updated.
+       Tweak per-face LCD filtering controls.
 
-       * docs/CHANGES: Updated.
+       Thing are simpler with a NULL-function pointer.
 
-2017-01-25  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): New
+       pointer to the filter function.
+       (FT_LibraryRec): Remove unused `lcd_filter'.
+       (FT_Bitmap_LcdFilterFunc, ft_lcd_filter_fir):  Move from here...
+       * include/freetype/ftlcdfil.h (FT_Bitmap_LcdFilterFunc,
+       ft_lcd_filter_fir): ... to here.
 
-       [sfnt] s/TT_NameEntry/TT_Name/.
+       * src/base/ftobjs.c (ft_open_face_internal): NULL-initialize the
+       per-face filter.
+       (FT_Face_Properties): Set it.
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Simplify.
 
-       * include/freetype/internal/tttypes.h (TT_NameEntryRec): Renamed
-       to...
-       (TT_NameRec): This.
-       (TT_NameTableRec): Updated.
+       * src/base/ftlcdfil.c (ft_lcd_filter_fir, FT_Libary_SetLcdFilter):
+       Minor.
 
-       * src/base/ftsnames.c (FT_Get_Sfnt_Name): Updated.
+2017-09-24  Jonathan Kew  <jfkthame@gmail.com>
 
-       * src/sfnt/sfdriver.c (sfnt_get_ps_name): Updated.
+       [sfnt] Fix `premultiply_data' (#52092).
 
-       * src/sfnt/sfobjs.c (tt_name_entry_ascii_from_utf16,
-       tt_name_entry_ascii_from_other): Renamed to...
-       (tt_name_ascii_from_utf16, tt_name_entry_ascii_from_other): This,
-       respectively.
-       (TT_NameEntry_ConvertFunc): Renamed to...
-       (TT_Name_ConvertFunc): This.
-       (tt_face_get_name): Updated.
+       * src/sfnt/pngshim.c (premultiply_data): Don't use vector extension
+       if we have less than 16 bytes of data.
 
-       * src/sfnt/ttload.c (tt_face_load_name, tt_face_free_name):
-       Updated.
+2017-09-24  Werner Lemberg  <wl@gnu.org>
 
-2017-01-24  Werner Lemberg  <wl@gnu.org>
+       [otvalid] Fix handling of ValueRecords.
 
-       [sfnt] Fix Postscript name service for symbol fonts.
+       For GPOS pair positioning format 1 the description of ValueRecords
+       in the OpenType specification (1.8.2, from today) is wrong – the
+       offset has to be taken from the parent structure; in this case the
+       `PairSet' table.
 
-       * src/sfnt/sfdriver.c (sfnt_get_ps_name): Accept PID/EID=3/0
-       entries also.
+       * src/otvalid/otvgpos.c (otv_PairSet_validate): Set `extra3'.
+       (otv_PairPos_validate): Adjust.
 
-2017-01-24  Werner Lemberg  <wl@gnu.org>
+2017-09-23  Werner Lemberg  <wl@gnu.org>
 
-       [truetype] For OpenType 1.7: s/preferred/typographic/ (sub)family.
+       [otvalid] Handle `GSUB' and `GPOS' v1.1 tables.
 
-       * include/freetype/ftsnames.h
-       (FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY,
-       FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY): New macros.
-       (FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY,
-       FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY): Deprecated.
+       * src/otvalid/otvgsub.c (otv_GSUB_validate), src/otvalid/otvgpos.c
+       (otv_GPOS_validate): Implement it.
 
-       * include/freetype/ttnameid.h (TT_NAME_ID_TYPOGRAPHIC_FAMILY,
-       TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY): New macros.
-       (TT_NAME_ID_PREFERRED_FAMILY, TT_NAME_ID_PREFERRED_SUBFAMILY):
-       Deprecated.
+2017-09-23  Werner Lemberg  <wl@gnu.org>
 
-       * src/sfnt/sfobjs.c (sfnt_load_face): Updated.
+       [otvalid] Update common table handling to OpenType 1.8.2.
 
-       * docs/CHANGES: Updated.
+       * src/otvalid/otvcommn.c (otv_Device_validate): Handle
+       VariationIndex subtable.
+       (otv_Lookup_validate): Handle MarkFilteringSet.
 
-2017-01-23  Werner Lemberg  <wl@gnu.org>
+2017-09-23  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       [base] Add `FT_Set_Default_Properties' (#49187).
+       [build] Windows-style DLL versioning.
 
-       * include/freetype/ftmodapi.h: Add declaration.
+       * build/windows/ftver.rc: New VERSIONINFO resource.
+       * build/windows/vc2010/freetype.vcxproj: Further improvements.
 
-       * src/base/ftinit.c (ft_set_default_properties): Renamed to...
-       (FT_Set_Default_Properties): ... this.
-       (FT_Init_FreeType): Updated.
+2017-09-23  Ben Wagner  <bungeman@google.com>
 
-       * docs/CHANGES: Updated.
+       [truetype] Really fix #52082.
 
-2017-01-23  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttinterp.c (Ins_MDRP): Correct conditional.
 
-       [truetype] Minor updates for OpenType 1.8.1.
+2017-09-23  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttgxvar.h (GX_MVarTable): `axisCount' has been
-       removed from the specification; it is now reserved.
+       [otvalid] Handle `GDEF' v1.2 and v1.3 tables.
 
-       * src/truetype/ttgxvar.c (ft_var_load_mvar): Updated.
-       (GX_FVar_Head): Remove `countSizePairs'; the corresponding data
-       field in the `MVAR' table is now reserved.
-       (fvar_fields): Updated.
+       No validation of variation stuff yet.
 
-2017-01-23  Werner Lemberg  <wl@gnu.org>
+       * src/otvalid/otvgdef.c (otv_MarkGlyphSets_validate): New function.
+       (otv_GDEF_validate): Implement it.
 
-       [truetype] Avoid segfault for invalid variation data.
+2017-09-22  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttgxvar.c (ft_var_load_item_variation_store): Assure
-       `itemCount' is not zero.
+       [otvalid] Handle `BASE' v1.1 table.
 
-       Reported as
+       No validation of variation stuff yet.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=441
+       * src/otvalid/otvbase.c (otv_BASE_validate): Implement it.
 
-2017-01-20  Werner Lemberg  <wl@gnu.org>
+2017-09-22  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttinterp.c (TT_RunIns): Adjust loop detector limits.
+       [otvalid] Macros for 32bit offset support.
 
-2017-01-17  Werner Lemberg  <wl@gnu.org>
+       * src/otvalid/otvcommn.h (OTV_OPTIONAL_TABLE32,
+       OTV_OPTIONAL_OFFSET32, OTV_SIZE_CHECK32): New macros.
 
-       * include/freetype/ttnameid.h: Updated to OpenType 1.8.1.
+2017-09-21  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       (TT_APPLE_ID_FULL_UNICODE): New macro.
+       [build] Simplify Visual C++ 2010 project.
 
-       (TT_MS_LANGID_BOSNIAN_BOSNIA_HERZ_CYRILLIC,
-       TT_MS_LANGID_UPPER_SORBIAN_GERMANY,
-       TT_MS_LANGID_LOWER_SORBIAN_GERMANY, TT_MS_LANGID_IRISH_IRELAND,
-       TT_MS_LANGID_INUKTITUT_CANADA_LATIN, TT_MS_LANGID_BASHKIR_RUSSIA,
-       TT_MS_LANGID_LUXEMBOURGISH_LUXEMBOURG,
-       TT_MS_LANGID_GREENLANDIC_GREENLAND, TT_MS_LANGID_MAPUDUNGUN_CHILE,
-       TT_MS_LANGID_MOHAWK_MOHAWK, TT_MS_LANGID_BRETON_FRANCE,
-       TT_MS_LANGID_OCCITAN_FRANCE, TT_MS_LANGID_CORSICAN_FRANCE,
-       TT_MS_LANGID_ALSATIAN_FRANCE, TT_MS_LANGID_YAKUT_RUSSIA,
-       TT_MS_LANGID_KICHE_GUATEMALA, TT_MS_LANGID_KINYARWANDA_RWANDA,
-       TT_MS_LANGID_WOLOF_SENEGAL, TT_MS_LANGID_DARI_AFGHANISTAN): New
-       macros.
+       * build/windows/vc2010/freetype.vcxproj: Remove fake singlethreaded
+       configurations and tweak.
 
-       (TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC): Fix value.
+2017-09-21  Werner Lemberg  <wl@gnu.org>
 
-       (TT_MS_LANGID_GERMAN_LIECHTENSTEIN, TT_MS_LANGID_CATALAN_CATALAN,
-       TT_MS_LANGID_CHINESE_MACAO, TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT,
-       TT_MS_LANGID_KOREAN_KOREA, TT_MS_LANGID_ROMANSH_SWITZERLAND,
-       TT_MS_LANGID_SLOVENIAN_SLOVENIA, TT_MS_LANGID_BASQUE_BASQUE,
-       TT_MS_LANGID_SETSWANA_SOUTH_AFRICA,
-       TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA,
-       TT_MS_LANGID_ISIZULU_SOUTH_AFRICA, TT_MS_LANGID_KAZAKH_KAZAKHSTAN,
-       TT_MS_LANGID_KYRGYZ_KYRGYZSTAN, TT_MS_LANGID_KISWAHILI_KENYA,
-       TT_MS_LANGID_TATAR_RUSSIA, TT_MS_LANGID_ODIA_INDIA,
-       TT_MS_LANGID_MONGOLIAN_PRC, TT_MS_LANGID_TIBETAN_PRC,
-       TT_MS_LANGID_WELSH_UNITED_KINGDOM, TT_MS_LANGID_GALICIAN_GALICIAN,
-       TT_MS_LANGID_SINHALA_SRI_LANKA, TT_MS_LANGID_TAMAZIGHT_ALGERIA,
-       TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA, TT_MS_LANGID_YI_PRC,
-       TT_MS_LANGID_UIGHUR_PRC): New aliases.
+       [truetype] Integer overflow (#52082).
 
-       Remove commented out code.
+       * src/truetype/ttinterp.c (Ins_MDRP): Avoid FT_ABS.
 
-       (TT_NAME_ID_LIGHT_BACKGROUND, TT_NAME_ID_DARK_BACKGROUND,
-       TT_NAME_ID_VARIATIONS_PREFIX): New macros.
+2017-09-21  Werner Lemberg  <wl@gnu.org>
 
-       (HAVE_LIMIT_ON_IDENTS): Remove macro (which was useless since many
-       years), use guarded long macros by default and define short versions
-       as aliases for the long ones.
+       [sfnt] Fix postscript name for default instance of variation fonts.
 
-2017-01-15  Werner Lemberg  <wl@gnu.org>
+       Problem reported by Behdad.
 
-       * src/truetype/ttgxvar.c (tt_apply_var): Handle underline parameters
-       also.
+       * src/sfnt/sfdriver.c (sfnt_get_ps_name): Test
+       `is_default_instance'.
 
-2017-01-11  Werner Lemberg  <wl@gnu.org>
+2017-09-21  Werner Lemberg  <wl@gnu.org>
 
-       * src/base/ftobjs.c (ft_open_face_internal): Improve tracing.
+       [truetype] Fix `mmvar' array pointers, part 2.
 
-2017-01-11  Werner Lemberg  <wl@gnu.org>
+       The previous commit was incomplete.
 
-       [truetype] Actually use metrics variation service.
+       * src/truetype/ttgxvar.c: Properly initialize sub-array offsets for
+       `master' also.
 
-       * src/base/ftmm.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
-       (ft_face_get_mvar_service): New auxiliary function to look up
-       metrics variation service.
-       (FT_Set_Var_Design_Coordinates, FT_Set_MM_Blend_Coordinates,
-       FT_Set_Var_Blend_Coordinates): Call metrics variation service.
+2017-09-21  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttobjs.c (tt_face_init): Use metrics variations for
-       named instances.
+       [truetype] Fix `mmvar' array pointers.
 
-2017-01-11  Werner Lemberg  <wl@gnu.org>
+       Without this change, clang's AddressSanitizer reports many runtime
+       errors due to misaligned addresses.
 
-       [truetype] Provide metrics variation service.
+       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Use multiples of pointer
+       size for sub-array offsets into `mmvar'.
 
-       * include/freetype/internal/services/svmetric.h
-       (FT_Metrics_Adjust_Func): Reduce number of necessary parameters.
+2017-09-20  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttgxvar.c: Include FT_LIST_H.
-       (tt_size_reset_iterator): New auxiliary function for...
-       (tt_apply_var): New function.
+       [truetype] Integer overflows.
 
-       * src/truetype/ttgxvar.h: Updated.
+       Changes triggered by
 
-       * src/truetype/ttdriver.c (tt_service_metrics_variations): Add
-       `tt_apply_mvar'.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3429
 
-       * include/freetype/internal/ftserv.h (FT_ServiceCache): Add metrics
-       variation service.
+       * src/truetype/ttinterp.c (Ins_SHPIX, Ins_DELTAP): Use NEG_LONG.
+       (Ins_MIAP): Use SUB_LONG.
 
-2017-01-11  Werner Lemberg  <wl@gnu.org>
+2017-09-19  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       [truetype] Parse `MVAR' table.
+       [build] Fix DLL builds in Visual C++ project.
 
-       * src/truetype/ttgxvar.h (MVAR_TAG_XXX): New macros for MVAR tags.
-       (GX_Value, GX_MVarTable): New structures.
-       (GX_Blend): Add it.
+       * build/windows/vc2010/freetype.vcxproj: Use DynamicLibrary in Debug
+       and Release configurations.
+       * include/freetype/config/ftconfig.h (FT_EXPORT, FT_EXPORT_DEF)
+       [_DLL]: Use Visual C++ extensions.
 
-       * src/truetype/ttgxvar.c (GX_VALUE_SIZE, GX_VALUE_CASE,
-       GX_GASP_CASE): New macros.
-       (ft_var_get_value_pointer): New auxiliary function to get a pointer
-       to a value from various SFNT tables already stored in `TT_Face'.
-       (ft_var_load_mvar): New function.
-       (TT_Get_MM_Var): Call it.
-       (tt_done_blend): Updated.
+2017-09-19  John Tytgat  <John.Tytgat@esko.com>
 
-2017-01-11  Werner Lemberg  <wl@gnu.org>
+       [cff] Fix family name logic of pure CFF fontdata (#52056).
 
-       [truetype] More preparations for MVAR support.
+       1. If `FamilyName' is present in the CFF font, use this for
+          FT_Face's `family_name'.
+       2. Otherwise, use the face name and chop off any subset prefix.
+       3. If at this point FT_Face's `family_name' is set, use this
+          together with the full name to determine the style.
+       4. Otherwise, use `CIDFontName' as FT_Face's `family_name'.
+       5. If we don't have a valid style, use "Regular".
 
-       * src/truetype/ttobjs.c (tt_size_reset): Add argument to make
-       function only recompute ascender, descender, and height.
+       Previously, FT_Face's `family_name' entry for pure CFF fontdata
+       nearly always was the fontname itself, instead of the `FamilyName'
+       entry in the CFF font (assuming there is one).
 
-       * src/truetype/ttobjs.h: Updated.
+       * src/cff/cffobjs.c (cff_face_init) [pure_cff]: Implement it.
 
-       * src/truetype/ttdriver.c (tt_size_select, tt_size_request):
-       Updated.
+2017-09-18  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-2017-01-09  Werner Lemberg  <wl@gnu.org>
+       [build] Declutter Visual C++ 2010-2017 project.
 
-       [pcf] Disable long family names by default.
+       * build/windows/vc2010/freetype.vcxproj: Use MaxSpeed (/02)
+       optimization for Release configuration throughout the project.
 
-       * include/freetype/config/ftoption.h
-       (PCF_CONFIG_OPTION_LONG_FAMILY_NAMES): Comment out.
+2017-09-16  Werner Lemberg  <wl@gnu.org>
 
-2017-01-09  Werner Lemberg  <wl@gnu.org>
+       * Version 2.8.1 released.
+       =========================
 
-       [pcf] Make long family names configurable.
 
-       The change from 2016-09-29 was too radical (except for people using
-       the openSuSE GNU/Linux distribution).  To ameliorate the situation,
-       PCF_CONFIG_OPTION_LONG_FAMILY_NAMES gets introduced which controls
-       the feature; if set, a new PCF property option
-       `no-long-family-names' can be used to switch this feature off.
+       Tag sources with `VER-2-8-1'.
 
-       * include/freetype/config/ftoption.h, devel/ftoption.h
-       (PCF_CONFIG_OPTION_LONG_FAMILY_NAMES): New option.
+       * docs/VERSION.TXT: Add entry for version 2.8.1.
+       * docs/CHANGES: Updated.
 
-       * include/freetype/ftpcfdrv.h: New header file (only containing
-       comments currently, used for building the documentation).
+       * README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+       builds/windows/vc2005/index.html,
+       builds/windows/vc2008/freetype.vcproj,
+       builds/windows/vc2008/index.html,
+       builds/windows/vc2010/freetype.vcxproj,
+       builds/windows/vc2010/index.html,
+       builds/windows/visualc/freetype.dsp,
+       builds/windows/visualc/freetype.vcproj,
+       builds/windows/visualc/index.html,
+       builds/windows/visualce/freetype.dsp,
+       builds/windows/visualce/freetype.vcproj,
+       builds/windows/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.8/2.8.1/, s/28/281/.
 
-       * include/freetype/config/ftheader.h (FT_PCF_DRIVER_H): New macro.
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1.
 
-       * src/pcf/pcf.h (PCF_Driver): Add `no_long_family_names' field.
+       * builds/unix/configure.raw (version_info): Set to 21:0:15.
+       * CMakeLists.txt (VERSION_PATCH): Set to 1.
 
-       * src/pcf/pcfdrivr.c: Include FT_SERVICE_PROPERTIES_H and
-       FT_PCF_DRIVER_H.
-       (pcf_property_set, pcf_property_get): New functions.
-       (pcf_service_properties): New service.
-       (pcf_services): Updated.
-       (pcf_driver_init) [PCF_CONFIG_OPTION_LONG_FAMILY_NAMES]: Handle
-       `no_long_family_names'.
+2017-09-13  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
-       * src/pcf/pcfread.c (pcf_load_font): Handle `no_long_family_names'
-       and PCF_CONFIG_OPTION_LONG_FAMILY_NAMES.
+       [sfnt] lowest gcc for vectors (e1d0249e) is changed to 4.7.
+
+       __builtin_shuffle() was introduced in gcc-4.7.  The lowest
+       gcc to enable vector operation is delayed from 4.6 to 4.7.
+
+       * src/sfnt/pngshim.c (premultiply_data): Fix cpp-macro to
+       enable the vector operation, to change the lowest gcc version
+       from 4.6 to 4.7.
+
+2017-09-13  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [cache] Fix a possible overflow by signed integer comparison.
+
+       Improve the code by 5d3ff05615dda6d1325ed612381a17a0df04c975 ,
+       issues are found by Behdad Esfahbod and Werner Lemberg.
+
+       * src/cache/ftcbasic.c (FTC_ImageCache_Lookup): Replace
+       a subtraction to check higher bit by a bit operation,
+       and cpp-conditionalize for appropriate systems.  Add better
+       documentation to the comment.
+       (FTC_ImageCache_LookupScaler): Ditto.
+       (FTC_SBitCache_Lookup): Ditto.
+       (FTC_SBitCache_LookupScaler): Ditto.
+
+2017-09-13  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Really fix #41334 (#52000).
+
+       * src/autofit/aflatin.c (af_latin_hints_compute_segments): Set
+       `segment->delta' everywhere.
+
+2017-09-12  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [autofit, sfnt] Fix for `make multi'.
+
+       * src/autofit/afshaper.c: Include FT_ADVANCE_H, to use
+       FT_Get_Advance() in it.
+       * src/sfnt/ttcmap.c: Include FT_SERVICE_POSTSCRIPT_CMAPS_H
+       to use PS_Unicodes in it, also include `ttpost.h' to use
+       tt_face_get_ps_name() in it.
+
+2017-09-11  Azzuro  <azzuro@team-mediaportal.com>
+
+       [build] Improve builds with different MS Visual Studio versions.
+
+       * builds/windows/vc2010/freetype.vcxproj: Switch platform toolset
+       according to the Visual Studio version.
+
+2017-09-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttkern.c (tt_face_load_kern): Reject format 2 tables.
+
+       Reported by Behdad.
+
+2017-09-09  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Improve communication with ftgrid.
+
+       * src/autofit/afhints.c (af_glyph_hints_get_segment_offset):
+       Provide values in font units.
+
+2017-09-08  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [base] Remove a check for resource ID in the resource fork driver.
+
+       LastResort.dfont has a marginal resource ID 0xFFFF for sfnt
+       resource.  Inside Macintosh: More Macintosh Toolbox, `Resource IDs'
+       (1-46), tells that some IDs are reserved and should not be used.
+       FreeType2 just uses resource ID to sort the fragmented resource.
+       To accept the marginal fonts, the checking is removed.
+
+       * src/base/ftrfork.c (FT_Raccess_Get_DataOffsets): Remove res_id
+       validity check, fix a trace message format.
+
+2017-09-08  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
+
+       [sfnt, truetype] Register the tags for marginal fonts.
+
+       The first 32bit of standard TrueType variants is 0x00010000,
+       `OTTO', `ttcf', `true' or `typ1'.  2 marginal dfonts on legacy Mac
+       OS X, Keyboard.dfont and LastResort.dfont, have the sfnt resources
+       starting 0xA5 followed by `kbd' or `lst'.  Considering the following
+       data could be parsed as conventional TrueType fonts, the header
+       checking is updated to allow these tags.  It seems that recent Mac
+       OS X has already switched to normal TTF for these fonts.
+
+       See the discussion at
+       http://u88.n24.queensu.ca/exiftool/forum/index.php?topic=3931.0
+
+       * include/freetype/tttags.h (TTAG_0xA5kbd, TTAG_0xA5lst): New header
+       tags for Keyboard.dfont and LastResort.dfont.
+       * src/sfnt/sfobjs.c (sfnt_open_font): Accept the sfnt resource
+       starts with TTAG_0xA5kbd or TTAG_0xA5lst.
+       * src/truetype/ttobjs.c (tt_face_init): Accept the face with the
+       format tag is TTAG_0xA5kbd or TTAG_0xA5lst.
+
+2017-09-05  Werner Lemberg  <wl@gnu.org>
+
+       Fix multiple calls of `FT_Bitmap_Convert'.
+
+       The documentation of `FT_Bitmap_Convert' says that multiple calls do
+       proper reallocation of the target FT_Bitmap object.  However, this
+       failed for the sequence
+
+         non-empty bitmap
+         empty bitmap
+         non-empty bitmap
+
+       Reason was that `FT_Bitmap_Convert' only reallocated the bitmap
+       buffer if it became too small; it didn't make the buffer smaller.
+       For an empty bitmap following a non-empty one, only the buffer
+       dimension got set to zero, without deallocation.  If the next call
+       was a non-empty buffer again, an assertion in `ft_mem_qrealloc' was
+       triggered.
+
+       * src/base/ftbitmap.c (FT_Bitmap_Convert): Always reallocate target
+       buffer to the correct size.
+
+       * docs/CHANGES: Document it.
+
+2017-09-05  Werner Lemberg  <wl@gnu.org>
+
+       [bdf] Fix size and resolution handling.
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init): Use `SIZE' values if
+       `POINT_SIZE', `RESOLUTION_X', or `RESOLUTION_Y' properties are
+       missing.
+
+       * docs/CHANGES: Document it.
+
+2017-08-25  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       Swap `ALLOC_MULT' arguments (#51833).
+
+       * src/base/ftbitmap.c (ft_bitmap_assure_buffer): Updated.
+       * src/winfonts/winfnt.c (FNT_Load_Glyph): Updated.
+       * src/raster/ftrend1.c (ft_raster1_render): Updated.
+
+2017-08-23  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Fix clang compilation (#51788).
+
+       * src/sfnt/pngshim.c (premultiply_data): Use vectors instead of
+       scalars.
+       (vector_shuffle): New macro to take care of a different built-in
+       function name on clang.
+
+2017-08-22  Werner Lemberg  <wl@gnu.org>
+
+       [base] Don't zero out allocated memory twice (#51816).
+
+       Patch applied from bug report.
+
+       * src/base/ftutil.c (ft_mem_qrealloc): Use low-level allocation to
+       avoid unnecessary overhead.
+
+2017-08-22  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Integer overflow.
+
+       Changes triggered by
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=3107
+
+       * src/truetype/ttinterp.c (Ins_MDRP, Ins_MIRP, Ins_ALIGNPTS): Use
+       NEG_LONG.
+
+2017-08-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [sfnt] Avoid synthetic unicode for symbol fonts with PUA.
+
+       Reported as
+
+         https://bugs.chromium.org/p/chromium/issues/detail?id=754574
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Check for FT_ENCODING_MS_SYMBOL.
+
+2017-08-16  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/pngshim.c (premultiply_data): Fix compiler warnings.
+
+2017-08-15  Behdad Esfahbod  <behdad@behdad.org>
+
+       [sfnt] Speed up PNG image loading.
+
+       This reduces the overhead of `premultiply_data' by 60%.
+
+       * src/sfnt/pngshim.c (premultiply_data): Provide code which uses
+       gcc's (and clang's) `vector_byte' attribute to process 4 pixels at a
+       time.
+
+2017-08-11  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt, truetype] Improve handling of missing sbits.
+
+       Requested by Behdad.
+
+       Modern bitmap-only SFNTs like `NotoColorEmoji.ttf' don't contain
+       entries in the bitmap strike(s) for empty glyphs.  Instead, they
+       rely that a space glyph gets created from the font's metrics data.
+       This commit makes FreeType behave accordingly.
+
+       * include/freetype/fterrdef.h (FT_Err_Missing_Bitmap): New error
+       code.
+
+       * src/sfnt/ttsbit.c (tt_sbit_decoder_load_image): Change error codes
+       to make a distinction between a missing bitmap in a composite and a
+       simple missing bitmap.
+
+       * src/truetype/ttgload.c (TT_Load_Glyph): For a missing bitmap (in a
+       bitmap-only font), synthesize an empty bitmap glyph if metrics are
+       available.
+
+2017-08-10  Werner Lemberg  <wl@gnu.org>
+
+       [base] Minor API improvement for default variation axis setting.
+
+       * src/base/ftmm.c (FT_Set_MM_Design_Coordinates,
+       FT_Set_Var_Design_Coordinates, FT_Set_MM_Blend_Coordinates,
+       FT_Set_Var_Blend_Coordinates): Allow coords==NULL if num_coords==0.
 
        * docs/CHANGES: Updated.
 
-2017-01-09  Werner Lemberg  <wl@gnu.org>
+2017-08-08  Werner Lemberg  <wl@gnu.org>
 
-       [pcf] Introduce a driver structure.
+       [psnames] Really fix issue #49949.
 
-       To be filled later on with something useful.
+       We now use a separate preprocessor macro to handle both definition
+       and declaration of the glyph name arrays.
 
-       * src/pcf/pcf.h (PCF_Driver): New structure.
+       * src/psnames/psmodule.c (DEFINE_PS_TABLE_DATA): New macro.
 
-       * src/pcf/pcfdrivr.c (pcf_driver_init, pcf_driver_done): New dummy
-       functions.
-       (pcf_driver_class): Updated.
+       * src/tools/glnames.py (StringTable::dump,
+       StringTable::dump_sublist): Use `DEFINE_PS_TABLE_DATA'.
+       (dump_encoding): Ditto.
+       (main): Use `wb' mode for writing the output file, which works on
+       Windows also.
 
-2017-01-08  Werner Lemberg  <wl@gnu.org>
+       * src/psnames/pstables.h: Regenerated.
 
-       [truetype] Again some GX code shuffling.
+2017-08-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       We need this later on for MVAR also.
+       [smooth] Harmony LCD rendering.
+
+       This is a new technology for LCD-optimized rendering. It capitalizes
+       on the fact that each color channel grid is shifted by a third of a
+       pixel.  Therefore it is logical to render 3 separate monochrome
+       bitmaps shifting the outline by 1/3 pixel, and then combine them.
+       Importantly, the resulting output does not require additional LCD
+       filtering.
+
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic)
+       [!FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Implement new LCD-optimized
+       rendering.
+
+       * include/freetype/ftlcdfil.h, include/freetype/freetype.h,
+       include/freetype/config/ftoption.h, devel/ftoption.h: Updated
+       documentation.
+
+2017-08-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Clean up.
+
+2017-08-08  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       * src/sfnt/ttpost.c (format): Use otspec-compliant versions.
+
+2017-08-05  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Integer overflow.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2868
+
+       * src/truetype/ttinterp.c (Ins_ALIGNRP): Use NEG_LONG.
+
+2017-08-05  Werner Lemberg  <wl@gnu.org>
+
+       [base, truetype] New function `FT_Get_Var_Axis_Flags'.
+
+       The reserved `flags' field got a value in OpenType version 1.8.2;
+       unfortunately, the public `FT_Var_Axis' structure misses the
+       corresponding element.  Since we can't add a new field, we add an
+       access function.
+
+       * src/base/ftmm.c (FT_Get_Var_Axis_Flags): New function.
+
+       * include/freetype/ftmm.h (FT_VAR_AXIS_FLAG_HIDDEN): New macro.
+       Updated.
+
+       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Increase allocated memory
+       of `mmvar' to hold axis flags.
+       Fill the axis flags array.
+
+       * docs/CHANGES: Updated.
+
+2017-08-03  Nikolaus Waxweiler  <madigens@gmail.com>
+
+       [truetype] Fix metrics of B/W hinting in v40 mode.
+
+       Phantom points are now saved outside v40 backwards compatibility
+       mode.  This fixes the jumping glyphs when switching between v35 and
+       v40 monochrome mode.
+
+       * src/truetype/ttgload.c (TT_Hint_Glyph): Fix inversed bool logic.
+
+2017-08-03  Nikolaus Waxweiler  <madigens@gmail.com>
+
+       [truetype] Do not set any ClearType flags in v40 monochrome mode.
+
+       This fixes weird behavior of instructions that resulted in rendering
+       differences between v35 and v40 in monochrome mode, e.g., in
+       `timesbi.ttf'.
+
+       * src/truetype/ttinterp.c (Ins_GETINFO)
+       [TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL]: Check
+       `subpixel_hinting_lean'.
+
+2017-08-01  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Fix thinko.
+
+2017-08-01  Behdad Esfahbod  <behdad@behdad.org>
+
+       [truetype] Fix loading of named instances.
+
+       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Preserve file position
+       while loading the `avar' table.
+
+2017-08-01  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt, truetype] Minor adjustments for OpenType 1.8.2.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): The units per EM value has now
+       (tighter) limits.
+
+       * src/truetype/ttgload.c (load_truetype_glyph): The new OpenType
+       version explicitly allows all negative values for the number of
+       contours if we have a composite glyph (this is for better backwards
+       compatibility I guess), but it still recommends value -1.
+
+2017-07-26  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Integer overflow.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2738
+
+       * src/cff/cf2hints.c (cf2_glyphpath_computeOffset,
+       cf2_glyphpath_curveTo): Use ADD_INT32.
+
+2017-07-13  Werner Lemberg  <wl@gnu.org>
+
+       [base] Fix memory leak.
+
+       Reported as
+
+         https://bugs.chromium.org/p/chromium/issues/detail?id=738362
+
+       * src/base/ftglyph.c (FT_Get_Glyph): Do proper deallocation in case
+       of error.
+
+2017-07-12  Werner Lemberg  <wl@gnu.org>
+
+       [base] Integer overflow.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2573
+
+       * src/base/ftobjs.c (ft_glyphslot_grid_fit_metrics): Use
+       FT_PIX_CEIL_LONG and FT_PIX_ROUND_LONG.
+
+2017-07-12  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttpload.c (tt_face_get_location): Off-by-one typo.
+
+       Also improve tracing message.
+
+       Problem reported as
+
+         https://bugs.chromium.org/p/chromium/issues/detail?id=738919
+
+2017-07-07  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Integer overflow.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2517
+
+       * src/cff/cf2blues.c (cf2_blues_capture): Use SUB_INT32.
+
+2017-07-05  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttcmap.c (tt_cmap_unicode_class_rec): Fix warning.
+
+2017-07-05  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgxvar.c (FT_Stream_SeekSet): Fix warning (#51395).
+
+2017-07-04  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Prevent address overflow (#51365).
+
+       * src/truetype/ttgxvar.c (FT_Stream_SeekSet): Add guard.
+
+2017-07-03  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       * src/base/ftlcdfil.c (ft_lcd_filter_fir): Improve code.
+
+2017-07-03  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Integer overflow.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2455
+
+       * src/truetype/ttinterp.c (Ins_SCFS): Use SUB_LONG.
+
+2017-07-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Ignore No_Unicode_Glyph_Name.
+
+2017-06-28  Ben Wagner  <bungeman@google.com>
+
+       Avoid Microsoft compiler warnings (#51331).
+
+       While clang's sanitizer recommends a cast to unsigned for safe
+       negation (to handle -INT_MIN), both MSVC and Visualc emit warning
+       C4146 if an unsigned value gets negated.
+
+       * include/freetype/internal/ftcalc.h (NEG_LONG, NEG_INT32),
+       src/base/ftcalc.c (FT_MOVE_SIGN): Replace negation with a
+       subtraction.
+
+2017-06-27  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffparse.c (do_fixed): Fix typo.
+
+       Spotted by chris <chris@gcjd.org>.
+
+2017-06-27  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Integer overflows.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2384
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2391
+
+       * src/base/ftcalc.c (FT_MulDiv, FT_MulDiv_No_Round, FT_DivFix): Use
+       NEG_LONG.
+
+       * src/truetype/ttinterp.c (Ins_SxVTL): Use NEG_LONG.
+
+2017-06-24  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Integer overflows.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2364
+
+       * src/truetype/ttinterp.c (Ins_ISECT): Use NEG_LONG.
+
+2017-06-22  Werner Lemberg  <wl@gnu.org>
+
+       [cff, truetype] Integer overflows.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2323
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2328
+
+       * src/cff/cf2blues.c (cf2_blues_capture): Use ADD_INT32 and
+       SUB_INT32.
+
+       * src/truetype/ttinterp.c (Ins_SDPVTL): Use SUB_LONG and NEG_LONG.
+
+2017-06-21  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [sfnt] Synthesize a Unicode charmap if one is missing.
+
+       * src/sfnt/ttcmap.h (tt_cmap_unicode_class_rec): Declare it.
+       * src/sfnt/ttcmap.c (tt_get_glyph_name, tt_cmap_unicode_init,
+       tt_cmap_unicode_done, tt_cmap_unicode_char_index,
+       tt_cmap_unicode_char_next, tt_cmap_unicode_class_rec): Implement
+       synthetic Unicode charmap class.
+       (tt_get_cmap_info): Make sure the callback is available.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face)
+       [FT_CONFIG_OPTION_POSTSCRIPT_NAMES]: If Unicode charmap is missing,
+       synthesize one.
+
+       * include/freetype/config/ftoption.h: Document it.
+       * devel/ftoption.h: Ditto.
+
+2017-06-20  Tony Theodore  <tonyt@logyst.com>
+
+       Fix pkg-config in freetype-config for cross-compiling (#51274).
+
+       * builds/unix/unix-def.in (PKG_CONFIG): New variable.
+       (freetype-config): Use it in sed expression.
+
+       * builds/unix/freetype-config.in: s/pkg-config/%PKG_CONFIG%/.
+
+2017-06-20  Werner Lemberg  <wl@gnu.org>
+
+       [cff, truetype] Integer overflows.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2300
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2313
+
+       * src/cff/cf2hints.c (cf2_hintmap_adjustHints): Use ADD_INT32.
+
+       * src/truetype/ttinterp.c (Ins_ABS): Avoid FT_ABS.
+
+2017-06-17  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [base, smooth] LCD filtering cleanups.
+
+       * src/base/ftlcdfil.c (ft_lcd_filter_fir, _ft_lcd_filter_legacy):
+       Clean up, start filtering from the bottom-left origin.
+
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Updated.
+
+2017-06-16  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Integer overflows.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2270
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2276
+
+       * src/truetype/ttinterp.c (Ins_MDRP, _iup_worker_interpolate): Use
+       ADD_LONG and SUB_LONG.
+
+2017-06-15  Werner Lemberg  <wl@gnu.org>
+
+       [bdf, cff] Integer overflows.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2244
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2261
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init): Replace calls to FT_ABS with
+       direct code to avoid value negation.
+
+       * src/cff/cf2blues.c (cf2_blues_capture): Use SUB_INT32 and
+       ADD_INT32.
+
+2017-06-13  Werner Lemberg  <wl@gnu.org>
+
+       * src/winfonts/winfnt.c (FNT_Face_Init): Don't set active encoding.
+
+       FreeType only sets a default active encoding for Unicode.
+
+2017-06-13  Werner Lemberg  <wl@gnu.org>
+
+       [cff, truetype] Integer overflows.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2216
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2218
+
+       * src/cff/cf2fixed.h (cf2_fixedAbs): Use NEG_INT32.
+
+       * src/truetype/ttinterp.c (Ins_IP): Use SUB_LONG.
+
+2017-06-11  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Integer overflows.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2200
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2210
+
+       * src/cff/cf2hints.c (cf2_hintmap_insertHint): Use SUB_INT32 and
+       ADD_INT32.
+
+       * src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdVMOVETO>: Use
+       ADD_INT32.
+
+2017-06-10  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix TT_Set_Var_Design.
+
+       Reported by Nikolaus Waxweiler <madigens@gmail.com>.
+
+       * src/truetype/ttgxvar.c (TT_Set_Var_Design): Correctly handle the
+       case where we have less input coordinates than axes.
+
+2017-06-10  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftcalc.c (FT_DivFix): Fix embarrassing typo.
+
+       Bug introduced 2017-05-28.
+
+2017-06-09  Werner Lemberg  <wl@gnu.org>
+
+       [cff, truetype] Integer overflows.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2144
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2151
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2153
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2173
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2186
+
+       * src/cff/cf2blues.c (cf2_blues_init): Use SUB_INT32.
+
+       * src/truetype/ttinterp.c (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): Use ADD_LONG,
+       SUB_LONG, NEG_LONG, FT_PIX_ROUND_LONG, FT_PIX_CEIL_LONG,
+       FT_PAD_ROUND_LONG
+       (Ins_SxVTL, Ins_MIRP): Use SUB_LONG.
+       (_iup_worker_shift): Use SUB_LONG and ADD_LONG.
+
+2017-06-09  Werner Lemberg  <wl@gnu.org>
+
+       Provide more macros for flooring, ceiling, and rounding.
+
+       These versions don't produce run-time errors due to integer
+       overflow.
+
+       * include/freetype/internal/ftobjs.h: Include FT_INTERNAL_CALC_H.
+       (FT_PAD_ROUND_LONG, FT_PAD_CEIL_LONG, FT_PIX_ROUND_LONG,
+       FT_PIX_CEIL_LONG): New macros.
+       (FT_PAD_ROUND_INT32, FT_PAD_CEIL_INT32, FT_PIX_ROUND_INT32,
+       FT_PIX_CEIL_INT32): New macros.
+
+2017-06-09  Werner Lemberg  <wl@gnu.org>
+
+       Remove unused macros.
+
+       * include/freetype/internal/ftcalc.h (ADD_INT, SUB_INT, MUL_INT,
+       NEG_INT): Deleted.
+
+2017-06-09  Werner Lemberg  <wl@gnu.org>
+
+       */*: Remove `OVERFLOW_' prefix.
+
+       This increases readability.
+
+2017-06-07  Werner Lemberg  <wl@gnu.org>
+
+       [cff, truetype] Integer overflows.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2133
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2137
+
+       * src/cff/cf2hints.c (cf2_hint_init): Use OVERFLOW_SUB_INT32.
+
+       * src/truetype/ttinterp.c (PROJECT, DUALPROJ): Use
+       OVERFLOW_SUB_LONG.
+
+2017-06-06  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Integer overflows.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2109
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2110
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2122
+
+       * src/cff/cf2blues.c (cf2_blues_init): Use OVERFLOW_SUB_INT32.
+
+       * src/cff/cf2hints.c (cf2_hintmap_map): Synchronize if-else
+       branches.
+
+2017-06-05  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Integer overflow.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2089
+
+       * src/cff/cffload.c (cff_blend_doBlend): User OVERFLOW_ADD_INT32.
+
+2017-06-04  Werner Lemberg  <wl@gnu.org>
+
+       [cff, truetype] Integer overflows.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2075
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2088
+
+       * src/cff/cf2font.c (cf2_font_setup): Use OVERFLOW_MUL_INT32.
+
+       * src/truetype/ttinterp.c (Ins_ISECT): Use OVERFLOW_MUL_LONG,
+       OVERFLOW_ADD_LONG, and OVERFLOW_SUB_LONG.
+
+2017-06-03  Werner Lemberg  <wl@gnu.org>
+
+       [base, cff, truetype] Integer overflows.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2060
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2062
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2063
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2068
+
+       * src/base/ftobjs.c (ft_glyphslot_grid_fit_metrics): Use
+       OVERFLOW_ADD_LONG and OVERFLOW_SUB_LONG.
+
+       * src/cff/cf2blues.c (cf2_blues_capture), src/cff/cf2hints.c
+       (cf2_hintmap_adjustHints): Use OVERFLOW_SUB_INT32.
+
+       * src/truetype/ttgload.c (compute_glyph_metrics): User
+       OVERFLOW_SUB_LONG.
+
+       * src/truetype/ttinterp.c (Direct_Move, Direct_Move_Orig,
+       Direct_Move_X, Direct_Move_Y, Direct_Move_Orig_X,
+       Direct_Move_Orig_Y, Move_Zp2_Point, Ins_MSIRP): Use
+       OVERFLOW_ADD_LONG and OVERFLOW_SUB_LONG.
+
+2017-06-03  Werner Lemberg  <wl@gnu.org>
+
+       * builds/unix/freetype-config.in: Fix pkg-config test (#51162).
+
+       Patch directly taken from bug report.
+
+2017-06-03  Werner Lemberg  <wl@gnu.org>
+
+       [bdf] Synchronize sanity checks with pcf driver.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2054
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2058
+
+       * src/bdf/bdfdrivr.c (BDF_Face_Init): Check font ascent and descent.
+       Check AVERAGE_WIDTH, POINT_SIZE, PIXEL_SIZE, RESOLUTION_X, and
+       RESOLUTION_Y properties.
+
+2017-06-03  Werner Lemberg  <wl@gnu.org>
+
+       [cff, truetype] Integer overflows.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2047
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2057
+
+       * src/cff/cf2hints.c (cf2_hintmap_map): Use OVERFLOW_SUB_INT32.
+
+       * src/truetype/ttinterp.c (Ins_ADD): Use OVERFLOW_ADD_LONG.
+       (Ins_SUB): Use OVERFLOW_SUB_LONG.
+       (Ins_NEG): Use NEG_LONG.
+
+2017-06-03  Werner Lemberg  <wl@gnu.org>
+
+       ftcalc.h: Avoid left-shift of negative numbers.
 
-       * src/truetype/ttgxvar.c (tt_hadvance_adjust): Split off computing
-       an item store variation delta into...
-       (ft_var_get_item_delta): ...new function.
+       Reported as
 
-2017-01-08  Werner Lemberg  <wl@gnu.org>
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2055
 
-       [truetype] Adjust font variation flags for MVAR.
+       * include/freetype/internal/ftcalc.h (INT_TO_F26DOT6,
+       INT_TO_F2DOT14, INT_TO_FIXED, F2DOT14_TO_FIXED): Use multiplication.
 
-       * include/freetype/internal/tttypes.h (TT_FACE_FLAG_VAR_XXX):
-       Remove all flags related to MVAR; replace it with...
-       (TT_FACE_FLAG_VAR_MVAR): ...this new macro.
-       (TT_Face): Remove `mvar_support' field (which was still unused).
+2017-06-02  Werner Lemberg  <wl@gnu.org>
 
-2017-01-06  Werner Lemberg  <wl@gnu.org>
+       [cff] Even more integer overflows.
 
-       [truetype] More GX code shuffling.
+       Reported as
 
-       We need this later on for MVAR also.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2046
 
-       * src/truetype/ttgxvar.c (tt_done_blend): Split off handling of item
-       variation store into...
-       (ft_var_done_item_variation_store): ...new function.
+       * src/cff/cf2intrp.c (cf2_doStems, cf2_interpT2CharString): Use
+       OVERFLOW_ADD_INT32.
 
-2017-01-06  Werner Lemberg  <wl@gnu.org>
+2017-06-02  Werner Lemberg  <wl@gnu.org>
 
-       [truetype] More generalization of GX stuff.
+       [cff] More integer overflows.
 
-       We need this later on for MVAR also.
+       Reported as
 
-       * src/truetype/ttgxvar.c (ft_var_load_delta_set_index_mapping): Add
-       parameters for delta-set index mapping and item variation store.
-       (ft_var_load_item_variation_store): Add parameter for item variation
-       store.
-       s/hvarData/varData/.
-       Move allocation of `hvar_table' to...
-       (ft_var_load_hvar): ...this function.
-       Updated.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2032
 
-2017-01-06  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cf2blues.c (cf2_blues_init): Use OVERFLOW_SUB_INT32.
 
-       [truetype] Some GX structure renames for generalization.
+2017-06-02  Werner Lemberg  <wl@gnu.org>
 
-       We need this later on for MVAR also.
+       [bdf] Don't left-shift negative numbers.
 
-       * src/truetype/ttgxvar.h (GX_HVarData): Renamed to...
-       (GX_ItemVarData): ...this.
-       (GX_HVarRegion): Renamed to...
-       (GX_VarRegion): ...this.
-       (GX_HVStore): Renamed to...
-       (GX_ItemVarStore): ...this.
-       (GX_WidthMap): Renamed to...
-       (GX_DeltaSetIdxMap): ...this.
+       Reported as
 
-       (GX_HVarTable): Updated.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2031
 
-       * src/truetype/ttgxvar.c: Updated.
+       * src/bdf/bdfdrivr.c (BDF_Face_Init): Use multiplication.
 
-2017-01-06  Werner Lemberg  <wl@gnu.org>
+2017-06-02  Werner Lemberg  <wl@gnu.org>
 
-       [truetype] Code shuffling.
+       [bdf] Fix integer scanning routines.
 
-       * src/truetype/ttgxvar.c (ft_var_load_hvar): Split off loading of
-       item variation store and delta set index mapping into...
-       (ft_var_load_item_variation_store,
-       ft_var_load_delta_set_index_mapping): ...new functions.
+       Reported as
 
-2017-01-06  Werner Lemberg  <wl@gnu.org>
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2029
 
-       [truetype] Add HVAR access without advance width map.
+       * src/bdf/bdflib.c (_bdf_atoul, _bdf_atol, _bdf_atous, _bdf_atos):
+       Stop scanning if result would overflow.
 
-       * src/truetype/ttgxvar.c (ft_var_load_hvar): Handle case where
-       `offsetToAdvanceWidthMapping' is zero.
-       (tt_hadvance_adjust): Implement direct deltaSet access by glyph
-       index.
+2017-06-02  Werner Lemberg  <wl@gnu.org>
 
-2017-01-06  Werner Lemberg  <wl@gnu.org>
+       [cff] Fix integer overflows.
 
-       [pcf] Revise driver.
+       Reported as
 
-       This commit improves tracing and handling of malformed fonts.  In
-       particular, the changes to `pcf_get_properties' fix
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2027
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=2028
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=379
+       * src/cff/cf2hints.c (cf2_hintmap_insertHint), src/cff/cf2intrp.c
+       (cf2_doFlex): Use OVERFLOW_ADD_INT32 and OVERFLOW_SUB_INT32.
 
-       * src/pcf/pcfread.c (tableNames): Use long names for better
-       readability.
-       (pcf_read_TOC): Allow at most 9 tables.
-       (pcf_get_properties): Allow at most 256 properties.
-       Limit strings array length to 256 * (65536 + 1) bytes.
-       Better tracing.
-       (pcf_get_metric): Trace metric data.
-       (pcf_get_metrics): Allow at most 65536 metrics.
-       Fix comparison of `metrics->ascent' and `metrics->descent' to avoid
-       potential overflow.
-       Better tracing.
-       (pcf_get_bitmaps): Allow at most 65536 bitmaps.
-       Better tracing.
-       (pcf_get_encodings, pcf_get_accel): Better tracing.
+2017-06-01  Werner Lemberg  <wl@gnu.org>
 
-       * src/pcf/pcfdrivr.c (PCF_Glyph_Load): Don't trace `format' details.
-       These are now shown by `pcf_get_bitmaps'.
+       [smooth] Some 32bit integer overflow run-time errors.
 
-2017-01-04  Werner Lemberg  <wl@gnu.org>
+       * src/smooth/ftgrays.c [STANDALONE] (OVERFLOW_ADD_LONG,
+       OVERFLOW_SUB_LONG, OVERFLOW_MUL_LONG, NEG_LONG): New macros.
+       [!STANDALONE]: Include FT_INTERNAL_CALC_H.
+       (gray_render_cubic): Use those macros where appropriate.
 
-       * src/pcf/pcfdrivr.c (PCF_Face_Init): Trace compression format.
+2017-06-01  Werner Lemberg  <wl@gnu.org>
 
-2017-01-04  Werner Lemberg  <wl@gnu.org>
+       * src/base/ftglyph.c (FT_Get_Glyph): Check `slot->advance'.
 
-       [cff] More consistency checks for pure CFFs.
+2017-06-01  Werner Lemberg  <wl@gnu.org>
 
-       Reported as
+       [psaux] 32bit integer overflow tun-time errors (#46149).
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=378
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings): Use
+       OVERFLOW_ADD_LONG and OVERFLOW_SUB_LONG where appropriate.
 
-       * src/cff/cffload.c (cff_font_load): Check element number and size
-       of Name and Top DICT indices.
+2017-06-01  Werner Lemberg  <wl@gnu.org>
 
-2017-01-04  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttinterp.c (TT_RunIns): Adjust loop counter again.
 
-       [cff, truetype] Minor tracing improvement.
+       Problem reported by Marek Kašík <mkasik@redhat.com>.
 
-       * src/cff/cffobjs.c (cff_face_init), src/truetype/ttobjs.c
-       (tt_face_init): Indent first tracing message from SFNT driver.
+       The problematic font that exceeds the old limit is Padauk-Bold,
+       version 3.002, containing bytecode generated by a buggy version of
+       ttfautohint.
 
-2017-01-03  Werner Lemberg  <wl@gnu.org>
+2017-05-31  Werner Lemberg  <wl@gnu.org>
 
-       [truetype] Various minor fixes.
+       [cff] 32bit integer overflow run-time errors 2/2 (#46149).
 
-       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check instruction
-       size only if we do native hinting.
-       (TT_Load_Glyph): Trace returned error code.
+       This commit handles the new engine.
 
-       * src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): Trace
-       returned error code.
-       (tt_size_ready_bytecode): Don't run `prep' table if `fpgm' table is
-       invalid.
+       * include/freetype/internal/ftcalc.h (OVERFLOW_ADD_INT32,
+       OVERFLOW_SUB_INT32, OVERFLOW_MUL_INT32, NEG_INT, NEG_LONG,
+       NEG_INT32): New macros.
 
-2017-01-03  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cf2ft.c (cf2_getScaleAndHintFlag): Use OVERFLOW_ADD_INT32.
 
-       [sfnt] Don't fail if PCLT, EBLC (and similar tables) are invalid.
+       * src/cff/cf2hints.c (cf2_getWindingMomentum, cf2_hint_init,
+       cf2_hintmap_map, cf2_glyphpath_hintPoint,
+       cf2_glyphpath_computeIntersection, cf2_glyphpath_computeOffset,
+       cf2_glyphpath_lineTo, cf2_glyphpath_curveTo): Use
+       OVERFLOW_ADD_INT32, OVERFLOW_SUB_INT32, OVERFLOW_MUL_INT32, and
+       NEG_INT32 where appropriate.
 
-       These tables are optional.
+       * src/cff/cf2intrp.c (cf2_doFlex, cf2_doBlend,
+       cf2_interpT2CharString): Ditto.
+       Also add some other code where needed to avoid overflow.
 
-       * src/sfnt/sfobjs.c (sfnt_load_face): Implement it.
+2017-05-30  Werner Lemberg  <wl@gnu.org>
 
-2017-01-03  Werner Lemberg  <wl@gnu.org>
+       [cff] 32bit integer overflow run-time errors 1/2 (#46149).
 
-       * src/cff/cffparse.c (cff_parse_num): Simplify.
+       This commit handles the old engine.
 
-2017-01-03  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cffgload.c: Include FT_INTERNAL_CALC_H.
+       (cff_decoder_parse_charstrings): Use OVERFLOW_ADD_LONG and
+       OVERFLOW_SUB_LONG where needed.
 
-       Various fixes for clang's undefined behaviour sanitizer.
+       * src/cff/cffparse.c: Include FT_INTERNAL_CALC_H.
+       (power_ten_limits): New static array.
+       (do_fixed): Use it to prevent multiplication overflow.
+       (cff_parser_run): Use OVERFLOW_ADD_LONG.
 
-       * src/cff/cffload.c (FT_fdot14ToFixed): Fix casting.
-       (cff_blend_doBlend): Don't left-shift negative numbers.
-       Handle 5-byte numbers byte by byte to avoid alignment issues.
+2017-05-30  Werner Lemberg  <wl@gnu.org>
 
-       * src/cff/cffparse.c (cff_parse_num): Handle 5-byte numbers byte by
-       byte to avoid alignment issues.
+       [psaux] Correctly handle sequences of multiple number signs.
 
-       * src/cid/cidload (cid_read_subrs): Do nothing if we don't have any
-       subrs.
+       * src/psaux/psconv.c (PS_Conv_Strtol, PS_Conv_ToFixed): Return zero
+       if we encounter more than a single sign.
 
-       * src/psaux/t1decode.c (t1_decode_parse_charstring): Fix tracing.
+2017-05-29  Werner Lemberg  <wl@gnu.org>
 
-       * src/tools/glnames.py (main): Put `DEFINE_PSTABLES' guard around
-       definition of `ft_get_adobe_glyph_index'.
+       [pcf] 32bit integer overflow run-time errors (#46149).
 
-       * src/psnames/pstables.h: Regenerated.
+       * src/pcf/pcfread.c (pcf_get_accel): Add sanity checks for
+       `fontAscent' and `fontDescent'.
+       (pcf_load_font): Add sanity checks for global height.
+       Add sanity checks for AVERAGE_WIDTH, POINT_SIZE, PIXEL_SIZE,
+       RESOLUTION_X, and RESOLUTION_Y properties.
 
-       * src/psnames/psmodule.c: Include `pstables.h' twice to get both
-       declaration and definition.
+2017-05-29  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttgxvar.c (FT_fdot14ToFixed, FT_intToFixed): Fix
-       casting.
+       Handle some integer overflow run-time errors (#46149, #48979).
 
-2017-01-01  Werner Lemberg  <wl@gnu.org>
+       This commit (mainly for 32bit CPUs) is the first of a series of
+       similar commits to handle known integer overflows.  Basically, all
+       of them are harmless, since they affect rendering of glyphs only,
+       not posing security threats.  It is expected that fuzzying will show
+       up more overflows, to be fixed in due course.
 
-       [cff] Handle multiple `blend' operators in a row correctly.
+       The idea is to mark places where overflows can occur, using macros
+       that simply cast to unsigned integers, because overflow arithmetic
+       is well defined in this case.  Doing so suppresses run-time errors
+       of sanitizers without adding computational overhead.
 
-       Reported as
+       * include/freetype/internal/ftcalc.h (OVERFLOW_ADD_INT,
+       OVERFLOW_SUB_INT, OVERFLOW_MUL_INT, OVERFLOW_ADD_LONG,
+       OVERFLOW_SUB_LONG, OVERFLOW_MUL_LONG): New macros.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=368
+       * src/base/ftcalc.c (FT_RoundFix, FT_CeilFix, FT_Matrix_Multiply,
+       FT_Matrix_Multiply_Scaled, FT_Vector_Transform_Scaled,
+       ft_corner_orientation): Use new macros.
 
-       * src/cff/cffload.c (cff_blend_doBlend): Adjust `parser->stack'
-       pointers into `subFont->blend_stack' after reallocation.
+       * src/base/ftoutln.c (FT_Outline_Get_Orientation): Use new macros.
 
-2017-01-01  Werner Lemberg  <wl@gnu.org>
+2017-05-28  Werner Lemberg  <wl@gnu.org>
 
-       [sfnt] Return correct number of named instances for TTCs.
+       * include/freetype/internal/ftcalc.h (FLOAT_TO_FIXED): Remove.
 
-       Without this patch, requesting information for face index N returned
-       the data for face index N+1 (or index 0).
+       This macro is not used.
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): Correctly adjust `face_index'
-       for negative `face_instance_index' values.
+2017-05-28  Werner Lemberg  <wl@gnu.org>
 
-2016-12-31  Werner Lemberg  <wl@gnu.org>
+       [cff] s/cf2_floatToFixed/cf2_doubleToFixed/.
 
-       */*: Use hex numbers for errors in tracing messages.
+       The new name better describes what the macro actually does;
+       additionally, we don't need a trailing `f' for literals (there was
+       only a single such instance in the code, but this caused a clang
+       warning because the macro itself uses `double' literals).
 
-2016-12-31  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cf2blues.c, src/cff/cf2blues.h, src/cff/cf2fixed.h,
+       src/cff/cf2font.c, src/cff/cf2hints.c: Updated.
 
-       [truetype] Check axis count in HVAR table.
+2017-05-28  Werner Lemberg  <wl@gnu.org>
 
-       Reported as
+       Fix negation of INT_MIN and LONG_MIN (#46149).
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=362
+       * src/base/ftcalc.c (FT_MOVE_SIGN): Add argument to pass unsigned
+       value, to be used as the result.
+       (FT_MulDiv, FT_MulDiv_No_Round, FT_DivFix, FT_MulFix,
+       FT_Vector_NormLen): Updated.
 
-       * src/truetype/ttgxvar.c (ft_var_load_hvar): Check axis count.
-       (ft_var_load_avar): Fix tracing message.
+2017-05-27  Werner Lemberg  <wl@gnu.org>
 
-2016-12-30  Werner Lemberg  <wl@gnu.org>
+       [truetype] Fix handling of design coordinates (#51127).
 
-       * Version 2.7.1 released.
-       =========================
+       * src/truetype/ttgxvar.c (tt_set_mm_blend): Compute all design
+       coordinates if we have to create the `blends->coord' array.
+       (TT_Get_MM_Blend, TT_Get_Var_Design): Select default instance
+       coordinates if no instance is selected yet.
 
+2017-05-24  Werner Lemberg  <wl@gnu.org>
 
-       Tag sources with `VER-2-7-1'.
+       [bdf, pcf] Support ISO646.1991-IRV character encoding (aka ASCII).
 
-       * docs/VERSION.TXT: Add entry for version 2.7.1.
+       Problem reported by Marek Kašík <mkasik@redhat.com>, cf.
 
-       * README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
-       builds/windows/vc2005/index.html,
-       builds/windows/vc2008/freetype.vcproj,
-       builds/windows/vc2008/index.html,
-       builds/windows/vc2010/freetype.vcxproj,
-       builds/windows/vc2010/index.html,
-       builds/windows/visualc/freetype.dsp,
-       builds/windows/visualc/freetype.vcproj,
-       builds/windows/visualc/index.html,
-       builds/windows/visualce/freetype.dsp,
-       builds/windows/visualce/freetype.vcproj,
-       builds/windows/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.7/2.7.1/, s/27/271/.
+         https://bugzilla.redhat.com/show_bug.cgi?id=1451795
 
-       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1.
+       * src/bdf/bdfdrivr.c (BDF_Face_Init), src/pcf/pcfdrivr.c
+       (PCF_Face_Init): Implement it.
 
-       * builds/unix/configure.raw (version_info): Set to 19:0:13.
-       * CMakeLists.txt (VERSION_PATCH): Set to 1.
+2017-05-20  Nikolaus Waxweiler  <madigens@gmail.com>
 
-2016-12-30  Werner Lemberg  <wl@gnu.org>
+       [truetype] Always use interpreter v35 for B/W rendering (#51051).
 
-       [ftfuzzer] Replace `rand' with an xorshift algorithm.
+       * src/truetype/ttgload.c (tt_loader_init)
+       [TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL]: Adjust
+       `subpixel_hinting_lean', `grayscale_cleartype', and
+       `vertical_lcd_lean' accordingly.
 
-       * src/tools/ftfuzzer/ftfuzzer.cc: Don't include `stdlib.h'.
-       (Random): Implement and use a 32bit `xorshift' algorithm.
+       * src/truetype/ttinterp.c (Ins_GETINFO): Updated.
+       (TT_RunIns): Update `backward_compatibility' flag.
 
-2016-12-30  Werner Lemberg  <wl@gnu.org>
+2017-05-20  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       [ftfuzzer] Restrict number of tested bitmap strikes.
+       [smooth] Implement minimal dynamic padding for LCD filtering.
 
-       Malformed fonts often have large values for the number of bitmap
-       strikes, and FreeType doesn't check the validity of all bitmap
-       strikes in advance.
+       Extra bitmap padding for LCD filtering depends on the filter.  The
+       default 5-tap filter needs 2 extra subpixels.  The light 3-tap filter
+       needs only 1 extra subpixel.  This space could be already available
+       due to rounding.  In order to optimize the padding, we now expand
+       CBox for the given filter weights before rounding.
 
-       Reported as
+       This change breaks current Skia (and Firefox).
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=353
+       * include/freetype/internal/ftobjs.h (FT_LibraryRec)
+       [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Remove `lcd_extra' field.
 
-       * src/tools/ftfuzzer/ftfuzzer.cc: Include `stdlib.h' for `rand'.
-       (Random): Small class to provide n randomly selected numbers
-       (without repetition) out of the value set [1,N].
-       (LLVMFuzzerTestOneInput): Use it to test only up to 10 bitmap
-       strikes.
+       * src/base/ftlcdfil.c (FT_Library_SetLcdFilterWeights,
+       FT_Library_SetLcdFilter): Remove `lcd_extra' initializations.
 
-2016-12-29  Werner Lemberg  <wl@gnu.org>
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic): Implement dymanic
+       LCD padding.
 
-       [truetype] Variation font API stability issues.
+2017-05-15  Werner Lemberg  <wl@gnu.org>
 
-       Make some functions work before a call to `TT_Set_MM_Blend'.
+       [sfnt] Return proper scaling values for SBIX bitmaps.
 
-       * src/truetype/ttgxvar.c (tt_hadvance_adjust): Exit immediately if
-       we don't blend.
-       (TT_Get_MM_Blend, TT_Get_Var_Design): Return default values if we
-       don't blend.
+       Problem reported by Hin-Tak Leung <htl10@users.sourceforge.net>.
 
-2016-12-29  Werner Lemberg  <wl@gnu.org>
+       * src/sfnt/ttsbit.c (tt_face_load_strike_metrics): Implement it.
 
-       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Check axis data.
+2017-05-15  Werner Lemberg  <wl@gnu.org>
 
-       Reported as
+       [truetype] Fix error handling for embedded bitmaps.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=348
+       Problem reported by Hin-Tak Leung <htl10@users.sourceforge.net>.
 
-2016-12-29  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttgload.c (TT_Load_Glyph)
+       [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: Handle error if font is not
+       scalable.
 
-       [truetype] Tracing fixes.
+2017-05-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * src/truetype/ttgxvar.c (tt_hadvance_adjust): Emit correct
-       information.
-       (TT_Set_Var_Design): Fix typo.
-       (TT_Get_Var_Design): Fix typos.
+       [autofit] Make autohint warping NORMAL option.
 
-2016-12-29  Werner Lemberg  <wl@gnu.org>
+       This moves warping option from LIGHT to NORMAL mode.  This makes LIGHT
+       truly void of hinting in x-direction, with left side bearing never
+       changed and right side bearing only altered by advance rounding.
+       Therefore, LIGHT is now ready to return fractional advance.  As a
+       NORMAL option, warping substitutes normal hinting.
 
-       */*: Use `0.5f' for tracing 16.16 numbers.
+       * src/autofit/afcjk.c (af_cjk_hints_apply): Updated.
+       * src/autofit/aflatin.c (af_latin_hints_apply): Updated.
+       * src/autofit/aflatin2.c (af_latin2_hints_apply): Updated.
 
-2016-12-29  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afloader.c (af_loader_load_glyph): Handle warping
+       phantom points as normal.
 
-       [pcf] Protect against gzip bombs.
+2017-05-14  Werner Lemberg  <wl@gnu.org>
 
-       Fix suggested by Kostya; reported as
+       Remove remnants of raster pool.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=345
+       * include/freetype/internal/ftobjs.h (FT_LibraryRec): Remove
+       `raster_pool' and `raster_pool_size' fields.
 
-       * src/pcf/pcfread.c (pcf_read_TOC): Limit number of TOC entries to
-       1024.
+       * src/base/ftobjs.c (FT_New_Library), src/raster/ftrend1.c
+       (ft_raster1_init), src/smooth/ftsmooth.c (ft_smooth_init): Updated.
 
-2016-12-28  Werner Lemberg  <wl@gnu.org>
+2017-05-13  Werner Lemberg  <wl@gnu.org>
 
-       [psnames] Only declare, not define, data in `pstables.h' (#49949).
+       * Version 2.8 released.
+       =======================
 
-       Pdfium includes `pstables.h' a second time; moving the definition
-       from `pstables.h' to `psmodule.c' saves more than 60kByte data
-       segment space for this case.
 
-       * src/tools/glnames.py (StringTable::dump,
-       StringTable::dump_sublist, dump_encoding, dump_array): Emit
-       additional code to only define tables if `DEFINE_PS_TABLES' is set.
+       Tag sources with `VER-2-8'.
 
-       * src/psnames/pstables.h: Regenerated.
-       * src/psnames/psmodule.c (DEFINE_PS_TABLES): Define.
+       * docs/VERSION.TXT: Add entry for version 2.8.
+       * docs/CHANGES: Updated.
 
-2016-12-28  Werner Lemberg  <wl@gnu.org>
+       * README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+       builds/windows/vc2005/index.html,
+       builds/windows/vc2008/freetype.vcproj,
+       builds/windows/vc2008/index.html,
+       builds/windows/vc2010/freetype.vcxproj,
+       builds/windows/vc2010/index.html,
+       builds/windows/visualc/freetype.dsp,
+       builds/windows/visualc/freetype.vcproj,
+       builds/windows/visualc/index.html,
+       builds/windows/visualce/freetype.dsp,
+       builds/windows/visualce/freetype.vcproj,
+       builds/windows/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.7.1/2.8/, s/271/28/.
 
-       [cff] Catch `blend' op in non-variant fonts.
+       * include/freetype/freetype.h (FREETYPE_MINOR): Set to 8.
+       (FREETYPE_PATCH): Set to 0.
 
-       Reported as
+       * builds/unix/configure.raw (version_info): Set to 20:0:14.
+       * CMakeLists.txt (VERSION_MINOR): Set to 8.
+       (VERSION_PATCH): Set to 0.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=334
+2017-05-12  Hin-Tak Leung  <htl10@users.sourceforge.net>
 
-       * src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdBLEND>: Don't
-       allow `blend' op for non-variant fonts.
+       Fix `FT_UINT_TO_POINTER' macro for Windows.
 
-2016-12-28  Werner Lemberg  <wl@gnu.org>
+       * builds/unix/ftconfig.in, builds/vms/ftconfig.h,
+       include/freetype/config/ftconfig.h (FT_UINT_TO_POINTER) [_WIN64]:
+       Fix definition.
 
-       [cff] Better check of number of blends.
+2017-05-11  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       * src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdBLEND>,
-       src/cff/cffparse.c (cff_parse_blend): Compare number of blends with
-       stack size.
+       [autofit] Add support for Chakma script.
 
-2016-12-27  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afblue.dat: Add blue zone data for Chakma.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       Documentation updates.
+       * src/autofit/afscript.h: Add Chakma standard character.
 
-       * docs/CHANGES: Add missing information.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Chakma data.
 
-       * docs/formats.txt: Rewritten and updated.
+2017-05-10  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-2016-12-27  Werner Lemberg  <wl@gnu.org>
+       [autofit] Add support for Kayah Li script.
 
-       [truetype, type1] Implement `FT_Get_Var_Design_Coordinates'.
+       * src/autofit/afblue.dat: Add blue zone data for Kayah Li.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       * src/truetype/ttgxvar.c (TT_Get_Var_Design): Implement.
-       (TT_Set_Var_Design): Fix tracing.
+       * src/autofit/afscript.h: Add Kayah Li standard character.
 
-       * src/type1/t1load.c (T1_Get_Var_Design): Implement.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Kayah Li data.
 
-2016-12-24  Werner Lemberg  <wl@gnu.org>
+2017-05-10  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       * src/truetype/ttpload.c (tt_face_load_hdmx): Ignore `version'.
+       [autofit] Add support for Bamum script.
 
-       Problem reported by 張俊芝 <418092625@qq.com>.
+       * src/autofit/afblue.dat: Add blue zone data for Bamum.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-2016-12-24  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afscript.h: Add Bamum standard character.
 
-       * src/sfnt/ttsbit.c (tt_face_load_sbit): Allow more version values.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Bamum data.
 
-       Some fonts seem to have the `version' field in the wrong byte order.
+2017-05-10  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       Problem reported by 張俊芝 <418092625@qq.com>.
+       [autofit] Add support for Saurashtra script.
 
-2016-12-24  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afblue.dat: Add blue zone data for Saurashtra.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       * src/truetype/ttpload.c (tt_face_load_loca): Sanitize table length.
+       * src/autofit/afscript.h: Add Saurashtra standard character.
 
-       This trivial fix allows us to accept more fonts.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Saurashtra
+       data.
 
-       Problem reported by 張俊芝 <418092625@qq.com>.
+2017-05-10  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-2016-12-24  Werner Lemberg  <wl@gnu.org>
+       [autofit] Add support for Buhid script.
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): Fix tracing.
+       * src/autofit/afblue.dat: Add blue zone data for Buhid.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-2016-12-22  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afscript.h: Add Buhid standard character.
 
-       * CMakeLists.txt: Make it work with cmake 2.8.11.2 (#49909).
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Buhid data.
 
-2016-12-22  Werner Lemberg  <wl@gnu.org>
+2017-05-08  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       Ensure used preprocessor symbols are defined (#49790).
+       [autofit] Add support for Shavian script.
 
-       * builds/unix/ftconfig.in, builds/vms/ftconfig.h,
-       include/freetype/config/ftconfig.h: Check `__GNUC__', `__IBMC__',
-       and `__SUNPRO_C' correctly.
+       * src/autofit/afblue.dat: Add blue zone data for Shavian.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-2016-12-22  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afscript.h: Add Shavian standard character.
 
-       * src/base/ftrfork.c (FT_Raccess_Get_DataOffsets): Check `count'.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Shavian data.
 
-       Reported as
+2017-05-08  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=308
+       [autofit] Add support for Vai script.
 
-2016-12-22  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afblue.dat: Add blue zone data for Vai.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       [cff] Protect against invalid `vsindex' and `blend' values.
+       * src/autofit/afscript.h: Add Vai standard character.
 
-       Reported as
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Vai data.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=305
+2017-05-08  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       * src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdVSINDEX,
-       cf2_cmdBLEND>: Implement it.
+       [autofit] Add support for Osmanya script.
 
-2016-12-22  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afblue.dat: Add blue zone data for Osmanya.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       [ftfuzzer] Always use Adobe CFF engine.
+       * src/autofit/afscript.h: Add Osmanya standard character.
 
-       * src/tools/ftfuzzer/ftfuzzer.cc (FT_Global::FT_Global): Implement
-       it.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Osmanya data.
 
-2016-12-21  Werner Lemberg  <wl@gnu.org>
+2017-05-08  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Thinko.
+       [autofit] Add support for Coptic script.
 
-       I should really stop coding late in the evening...
+       * src/autofit/afblue.dat: Add blue zone data for Coptic.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       Thanks again to Ben for checking.
+       * src/autofit/afscript.h: Add Coptic standard character.
 
-2016-12-21  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Coptic data.
 
-       [autofit] Support variation fonts.
+2017-05-08  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       (This ChangeLog entry was added later on.)
+       [autofit] Add support for Carian script.
 
-       * src/autofit/afglobal.c (af_face_globals_free): Remove useless
-       code.
+       * src/autofit/afblue.dat: Add blue zone data for Carian.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       * src/base/ftmm.c (FT_Set_MM_Design_Coordinates,
-       * FT_Set_Var_Design_Coordinates, FT_Set_MM_Blend_Coordinates,
-       FT_Set_Var_Blend_Coordinates): Finalize
-       auto-hinter data to enforce recomputation.  Note that this is a
-       brute-force method which should be improved.
+       * src/autofit/afscript.h: Add Carian standard character.
 
-2016-12-21  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Carian data.
 
-       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Thinko.
+2017-05-07  Werner Lemberg  <wl@gnu.org>
 
-       Don't apply deltas twice for non-phantom points.
+       [truetype] Add tricky font `DFGirl-W6-WIN-BF' (from Dynalab).
 
-       Spotted by Ben Wagner.
+       Reported by Roy Tam <roytam@gmail.com>.
 
-2016-12-21  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttobjs.c (tt_check_trickyness_family): Implement it.
 
-       [cff, truetype] Another try for #49829.
+2017-05-07  Roy Tam  <roytam@gmail.com>
+           Werner Lemberg  <wl@gnu.org>
 
-       * src/cff/cffdrivr.c: Don't include
-       `FT_SERVICE_METRICS_VARIATIONS_H'.
-       (cff_get_advances): Use `ttface->variation_support'.
+       [truetype] More tricky fonts (mainly from Dynalab).
 
-       * src/truetype/ttdriver.c (tt_get_advances): Use
-       `ttface->variation_support'.
+       * src/truetype/ttobjs.c (tt_check_trickyness_family,
+       tt_check_trickyness_sfnt_ids): Add them.
 
-       * src/truetype/ttgload.c (TT_Process_Simple_Glyph,
-       load_truetype_glyph): Use `ttface->variation_support'.
+2017-05-07  Werner Lemberg  <wl@gnu.org>
 
-2016-12-21  Werner Lemberg  <wl@gnu.org>
+       [truetype] Add tricky font `DLCHayMedium' (from Dynalab).
 
-       [truetype, sfnt] Introduce font variation flags to `TT_Face'.
+       Reported by Roy Tam <roytam@gmail.com>.
 
-       * include/freetype/internal/tttypes.h (TT_FACE_FLAG_VAR_XXX):
-       New macros describing available functionality of various OpenType
-       tables related to font variation.
-       (TT_Face): New fields `variation_support' and `mvar_support',
-       replacing and extending `use_fvar'.
+       * src/truetype/ttobjs.c (tt_check_trickyness_family): Implement it.
 
-       * src/sfnt/sfobjs.c (sfnt_init_face, sfnt_load_face): Use
-       `variation_support'.
+2017-05-03  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttgxvar.c (ft_var_load_hvar): Set `variation_support'
-       field.
-       (TT_Vary_Apply_Glyph_Deltas): Updated.
+       */*: s/backwards compatibility/backward compatibility/.
 
-2016-12-21  Werner Lemberg  <wl@gnu.org>
+2017-05-03  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       [base] Improve sanity check for Mac resources (#49888).
+       [autofit] Add support for Unified Canadian Syllabics script.
 
-       * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Abort if `rlen' is not
-       positive.
+       * src/autofit/afblue.dat: Add blue zone data for Unified Canadian
+       Syllabics.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-2016-12-20  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afscript.h: Add Unified Canadian Syllabics standard
+       character.
 
-       [base] More sanity checks for Mac resources.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Unified
+       Canadian Syllabics data.
 
-       We use
+2017-05-03  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org>
 
-         https://github.com/kreativekorp/ksfl/wiki/Macintosh-Resource-File-Format
+       [autofit] Add blue-zone support for Sundanese script.
 
-       and
+       This essentially moves the Sundanese script from the `Indic' hinter
+       to the `Latin' hinter.
 
-         https://developer.apple.com/legacy/library/documentation/mac/pdf/MoreMacintoshToolbox.pdf#page=151
+       * src/autofit/afblue.dat: Add blue zone data for Sundanese.
 
-       as references.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       * include/freetype/internal/ftrfork.h (FT_RFork_Ref): Use FT_Short
-       for `res_id'.
+       * src/autofit/afscript.h: Add Sundanese standard character and move
+       data out of AF_CONFIG_OPTION_INDIC block.
 
-       * src/base/ftrfork.c (FT_Raccess_Get_HeaderInfo): Extract map length
-       and use it to improve sanity checks.
-       Follow the specification more closely;in particular, all data types
-       are signed, not unsigned.
-       (FT_Raccess_Get_DataOffsets): Follow the specification more closely;
-       in particular, all data types are signed, not unsigned.
-       Add some sanity checks.
+       * src/autofit/afranges.c: Move Sundanese data out of
+       AF_CONFIG_OPTION_INDIC block.
 
-2016-12-20  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afstyles.h: Update Sundanese data; in particular, use
+       AF_WRITING_SYSTEM_LATIN.
 
-       [truetype] Improve logic for getting fast advance widths.
+2017-05-03  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       * src/cff/cffdrivr.c (cff_get_advances), src/truetype/ttdriver.c
-       (tt_get_advances): Use `is_default_instance' for test; this gets
-       recomputed after changing blend coordinates.
+       [autofit] Add support for Avestan script.
 
-2016-12-20  Ben Wagner  <bungeman@google.com>
-           Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afblue.dat: Add blue zone data for Avestan.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       [truetype] Fix linear metrics of GX variation fonts (#49829).
+       * src/autofit/afscript.h: Add Avestan standard character.
 
-       When asking for an unhinted non-default variations,
-       `linearVertAdvance' is currently the value from the `hmtx' table
-       instead of the actual value after applying the variation.  `HVAR'
-       support fixes this, but fonts will exist without that table and will
-       need sane fallback.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Avestan data.
 
-       Problem also reported as
+2017-05-02  Behdad Esfahbod  <behdad@behdad.org>
 
-         https://bugs.chromium.org/p/skia/issues/detail?id=5917
+       [truetype] Make `IUP' gvar deltas do the same as Apple (#50832).
 
-       * src/truetype/ttgload.c (TT_Process_Simple_Glyph,
-       load_truetype_glyph): Implement linear advance adjustments if `HVAR'
-       or `VVAR' tables are missing.
+       When points are not touched by gvar interpolation deltas, FreeType
+       gave a slightly different result than Apple's CoreText.
 
-2016-12-20  Werner Lemberg  <wl@gnu.org>
+       The OpenType working group will update the specification to document
+       the following behaviour: If the two points with deltas to the `left'
+       and `right' of the untouched point have the same coordinate, then
+       the inferred delta for the untouched point should be zero.
 
-       [cff, truetype] Fast advance width retrieval for fonts with HVAR.
+       * src/truetype/ttgxvar.c (tt_delta_interpolate): Implement new
+       behaviour.
 
-       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+2017-05-02  Werner Lemberg  <wl@gnu.org>
 
-       * src/base/ftadvanc.c (LOAD_ADVANCE_FAST_CHECK): Don't handle MM.
+       [autofit] Remove `slight' auto-hint mode again.
 
-       * src/cff/cffdrivr.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
-       (cff_get_advances): Test for HVAR and VVAR.
+       A poll on freetype-devel favoured changes directly applied to
+       `light'.
 
-       * src/truetype/ttdriver.c (tt_get_advances): Test for HVAR and VVAR.
+       * include/freetype/freetype.h (FT_LOAD_TARGET_SLIGHT,
+       FT_RENDER_MODE_SLIGHT): Removed.
 
-2016-12-18  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afcjk.c (af_cjk_hints_init), src/autofit/aflatin.c
+       (af_latin_hints_init), src/autofit/aflatin2.c
+       (af_latin2_hints_init): Revert change from 2017-04-22.
 
-       [base] Fix invalid mac font recursion.
+       * src/autofit/afloader.c (af_loader_load_glyph) Remove references to
+       FT_RENDER_MODE_SLIGHT.
+       [AF_CONFIG_OPTION_TT_SIZE_METRICS]: Enable TrueType-like metrics
+       unconditionally.
 
-       Reported as
+       * src/base/ftadvanc.c (LOAD_ADVANCE_FAST_CHECK): Revert change from
+       2017-04-22.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=304
+       * src/base/ftobjs.c (FT_Load_Glyph): Revert change from 2017-04-22.
 
-       * src/base/ftobjs.c (FT_Open_Face): Code moved to...
-       (ft_open_face_internal): ... this function.
-       Add a parameter to control whether we try special Mac font handling
-       in case of failure.
-       (FT_Open_Face, FT_New_Face, FT_New_Memory_Face,
-       open_face_from_buffer): Use `ft_open_face_internal'.
+       * src/pshinter/pshalgo.c (ps_hints_apply): Revert change from
+       2017-04-22.
 
-2016-12-18  Werner Lemberg  <wl@gnu.org>
+       * src/smooth/ftsmooth.c (ft_smooth_render): Revert change from
+       2017-04-22.
 
-       * src/cff/cffobjs.c (cff_face_init): Make named instances work.
+       * docs/CHANGES: Updated.
 
-2016-12-18  Werner Lemberg  <wl@gnu.org>
+2017-04-30  Werner Lemberg  <wl@gnu.org>
 
-       [truetype, cff] Extend `get_var_blend' function of MM service.
+       [autofit] Fix metrics computation.
 
-       In particular, we need access to named instance data.
+       Problem reported by Markus Trippelsdorf <markus@trippelsdorf.de> and
+       Nikolaus Waxweiler <madigens@gmail.com>.
 
-       * include/freetype/internal/services/svmm.h (FT_Get_Var_Blend_Func):
-       Add argument for `FT_MM_Var'.
+       * src/base/ftobjs.c (FT_Request_Size): Trigger recomputation of
+       auto-hinter metrics.  Without this change, multiple size changing
+       calls for a single face fail.
 
-       * src/cff/cffload.c (cff_get_var_blend): Updated.
-       * src/cff/cffload.h: Updated.
+2017-04-29  Werner Lemberg  <wl@gnu.org>
 
-       * src/cff/cf2ft.c (cf2_getNormalizedVector): Updated.
+       * src/truetype/ttdriver.c (tt_size_request): Properly check `error'.
 
-       * src/truetype/ttgxvar.c (tt_get_var_blend): Updated.
-       Accept value `NULL' for arguments.
-       * src/truetype/ttgxvar.h: Updated.
+       Reported by Earnestly <zibeon@googlemail.com> in
 
-2016-12-18  Werner Lemberg  <wl@gnu.org>
+         https://lists.nongnu.org/archive/html/freetype/2017-04/msg00031.html
 
-       [sfnt] Handle `fvar' with zero axes as a non-MM font.
+2017-04-27  Werner Lemberg  <wl@gnu.org>
 
-       This is better behaviour than exiting with an error.
+       Introduce AF_CONFIG_OPTION_TT_SIZE_METRICS configuration option.
 
-       * include/freetype/internal/tttypes.h (TT_Face): Add `use_fvar'
-       field.
+       * include/freetype/config/ftoption.h
+       (AF_CONFIG_OPTION_TT_SIZE_METRICS): New option, commented out by
+       default.
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): Compute `use_fvar', also
-       updating the validation code.
-       Use `use_fvar' to compute FT_FACE_FLAG_MULTIPLE_MASTERS.
+       * src/autofit/afloader.c (af_loader_load_glyph): Use
+       AF_CONFIG_OPTION_TT_SIZE_METRICS to guard the corresponding code.
 
-       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Remove `fvar' validation
-       code.
+2017-04-26  Werner Lemberg  <wl@gnu.org>
 
-2016-12-18  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/freetype.h (FT_Render_Mode): Fix order.
 
-       Minor GX code shuffling.
+       This retains backward compatibility.
 
-       * include/freetype/internal/tttypes.h (TT_Face): Move
-       `is_default_instance' into TT_CONFIG_OPTION_GX_VAR_SUPPORT
-       block.
+       Noted by Alexei.
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): Updated.
-       * src/truetype/ttgload.c (IS_DEFAULT_INSTANCE): New macro.
-       (TT_Load_Glyph): Use it.
+2017-04-22  Werner Lemberg  <wl@gnu.org>
 
-2016-12-18  Werner Lemberg  <wl@gnu.org>
+       [truetype] Do linear scaling for FT_LOAD_NO_HINTING (#50470).
 
-       [cff] Better handling of non-CFF font formats.
+       * src/truetype/ttobjs.h (TT_SizeRec): Add field `hinted_metrics' to
+       hold hinted metrics.
+       Make `metrics' a pointer so that `tt_glyph_load' can easily switch
+       between metrics.
 
-       * src/cff/cffload.c (cff_font_load): Pure CFFs don't have a
-       signature, so return `FT_Err_Unknown_File_Format' more often.
+       * src/truetype/ttdriver.c (tt_size_request): Updated.
+       (tt_glyph_load): Use top-level metrics if FT_LOAD_NO_HINTING is
+       used.
 
-2016-12-17  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttgload.c (TT_Hint_Glyph, TT_Process_Simple_Glyph,
+       TT_Process_Composite_Component, load_truetype_glyph,
+       compute_glyph_metrics, TT_Load_Glyph): Updated.
 
-       * src/cff/cffload.c (cff_build_blend_vector): Remove redundant code.
+       * src/truetype/ttinterp.c (TT_Load_Context): Updated.
 
-2016-12-17  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttobjs.c (tt_size_reset): Updated.
 
-       * src/truetype/ttobjs.c (tt_face_init): Simplify conditional code.
+       * src/truetype/ttsubpix.c (sph_set_tweaks): Updated.
 
-2016-12-17  Werner Lemberg  <wl@gnu.org>
+2017-04-22  Werner Lemberg  <wl@gnu.org>
 
-       [sfnt, truetype] Various sanitizing fixes.
+       Add new `slight' auto-hinting mode.
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): If the axis count in `fvar' is
-       zero, set `num_instances' to zero.
+       This mode uses fractional advance widths and doesn't scale glyphs
+       horizontally, only applying vertical scaling and hinting.
 
-       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Handle `fvar' table with
-       zero axes as invalid.
+       At the same time, the behaviour of the `light' auto-hinter gets
+       restored for backward compatibility: Both vertical and horizontal
+       scaling is again based on rounded metrics values (this was changed
+       in a commit from 2017-03-30 as a side effect).  To be more precise,
+       the behaviour is restored for TrueType fonts only; for other font
+       formats like Type 1, this is a new feature of the `light' hinting
+       mode.
 
-       * src/truetype/ttobjs.c (tt_face_init): Improve logic of loading
-       `loca', `cvt', `fpgm', and `prep' table.
+       * include/freetype/freetype.h (FT_LOAD_TARGET_SLIGHT): New macro.
+       (FT_RENDER_MODE_SLIGHT): New render mode.
 
-2016-12-17  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/internal/ftobjs.h (FT_Size_InternalRec): Add
+       `autohint_mode' and `autohint_metrics' fields.
 
-       Improve tracing of `FT_Open_Face'.
+       * src/autofit/afcjk.c (af_cjk_hints_init), src/autofit/aflatin.c
+       (af_latin_hints_init), src/autofit/aflatin2 (af_latin2_hints_init):
+       Updated.
 
-       * src/base/ftobjs.c (FT_Open_Face): Return info on number of
-       available faces and numbered instances, or the indices of the
-       requested face and numbered instance.
+       * src/autofit/afloader.c (af_loader_embolden_glyph_in_slot): Use
+       `autohint_metrics'.
+       (af_loader_load_glyph): s/internal/slot_internal/.
+       Initialize `autohint_metrics' and `autohint_mode' depending on
+       current auto-hint mode.
+       Use `autohint_metrics'.
+       Updated.
 
-       * src/sfnt/sfobjs. (sfnt_open_font): Trace number of subfonts.
+       * src/base/ftadvanc.c (LOAD_ADVANCE_FAST_CHECK): Updated.
 
-2016-12-17  Werner Lemberg  <wl@gnu.org>
+       * src/base/ftobjs.c (FT_Load_Glyph): Updated.
+       (FT_New_Size): Allocate `internal' object.
 
-       * src/cff/cffload.c (cff_load_private_dict): Always init `blend'.
+       * src/pshinter/pshalgo.c (ps_hints_apply): Updated.
 
-       Reported as
+       * src/smooth/ftsmooth.c (ft_smooth_render): Updated.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=295
+2017-04-22  Werner Lemberg  <wl@gnu.org>
 
-2016-12-16  Werner Lemberg  <wl@gnu.org>
+       Introduce `FT_Size_InternalRec' structure.
 
-       [truetype] Fix `cvar' sanity test.
+       We are going to extend this later on.
 
-       Reported by Dave Arnold.
+       * include/freetype/internal/ftobjs.h (FT_Size_InternalRec): New
+       structure with a single field `module_data'.
 
-       * src/truetype/ttgxvar.c (tt_face_vary_cvt): Use tuple count mask.
+       * src/base/ftobjs.c (FT_New_Size): Allocate `internal' field of
+       `FT_Size' structure.
 
-2016-12-16  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cffgload.c (cff_builder_init, cff_decoder_prepare): Use
+       `size->internal->module_data' instead of `size->internal'.
 
-       [cff, truetype] Remove compiler warnings; fix `make multi'.
+       * src/cff/cffobjs.c (cff_size_done): Deallocate `module_data'.
+       (cff_size_init, cff_size_select, cff_size_request): Use
+       `size->internal->module_data' instead of `size->internal'.
 
-       * src/cff/cf2font.h: Include `cffload.h'.
+       * src/cif/cidobjs.c (cid_size_done, cid_size_init,
+       cid_size_request): Use `size->internal->module_data' instead of
+       `size->internal'.
 
-       * src/cff/cffload.c: Include FT_MULTIPLE_MASTERS_H and
-       FT_SERVICE_MULTIPLE_MASTERS_H.
-       (cff_vstore_load): Eliminate `vsSize'.
-       (cff_load_private_dict): Tag as `FT_LOCAL_DEF'.
+       * src/psaux/psobjs.c (t1_builder_ini): Use
+       `size->internal->module_data' instead of `size->internal'.
 
-       * src/cff/cffload.h: Include `cffobjs.h'.
-       Provide declaration for `cff_load_private_dict'.
+       * src/type1/t1objs.c (T1_Size_Done, T1_Size_Init, T1_Size_Request):
+       Use `size->internal->module_data' instead of `size->internal'.
 
-       * src/truetype/ttgxvar.c (ft_var_load_hvar): Eliminate
-       `minorVersion' and `map_offset'.
+2017-04-21  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-2016-12-16  Werner Lemberg  <wl@gnu.org>
+       * src/smooth/ftsmooth.h: Remove unused guards and declaration.
 
-       [cff] Fix heap buffer overflow (#49858).
+2017-04-16  Hin-Tak Leung  <htl10@users.sourceforge.net>
 
-       * src/cff/cffparse.c (cff_parser_run): Add one more stack size
-       check.
+       Fix tracing messages.
 
-2016-12-15  Werner Lemberg  <wl@gnu.org>
+       * src/base/ftobjs.c (FT_Face_GetCharVariantIndex,
+       FT_Face_GetCharVariantIsDefault, FT_Face_GetVariantsOfChar): Print
+       correct function name.
 
-       Fix clang warnings.
+2017-04-08  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       * src/cff/cffload.c (cff_blend_doBlend): Add cast.
-       (cff_subfont_load): Set `error' correctly.
+       [autofit] Add support for Old Turkic script.
 
-       * src/sfnt/ttmtx.c (tt_face_get_metrics): Typo.
+       * src/autofit/afblue.dat: Add blue zone data for Old Turkic.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-2016-12-15  Dave Arnold  <darnold@adobe.com>
-           Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afscript.h: Add Old Turkic standard characters.
 
-       [cff] Implement CFF2 support (2/2).
-
-       The font variation code.  All parts dependent on the GX code in the
-       `truetype' module are guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT. 
-       In other words, you can still compile the `cff' module without
-       defining TT_CONFIG_OPTION_GX_VAR_SUPPORT (which brings you CFF2
-       support without font variation).
-
-       * src/cff/cf2font.c (cf2_font_setup): Add support for font
-       variation.
-       * src/cff/cf2font.h (CF2_Font): Add fields for variation data.
-
-       * src/cff/cf2ft.c (cf2_free_instance): Free blend data.
-       (cf2_getVStore, cf2_getNormalizedVector): New functions.
-       * src/cff/cf2ft.h: Updated.
-
-       * src/cff/cf2intrp.c: Include `cffload.h'.
-       (cf2_cmdRESERVED_15, cf2_cmdRESERVED_16): Replace with...
-       (cf2_cmdVSINDEX, cf2_cmdBLEND): ... this new enum values.
-       (cf2_doBlend): New function.
-       (cf2_interpT2CharString): Handle `vsindex' and `blend' opcodes.
-
-       * src/cff/cffload.c (FT_fdot14ToFixed): New macro.
-       (cff_vstore_done, cff_vstore_load): New functions.
-       (cff_blend_clear, cff_blend_doBlend, cff_blend_build_vector,
-       cff_blend_check_vector): New functions.
-       (cff_load_private_dict): Add arguments for blend vector.
-       Handle blend data.
-       (cff_subfont_load, cff_subfont_done): Updated.
-       (cff_font_load): Handle CFF2 variation store data.
-       (cff_font_done): Updated.
-       * src/cff/cffload.h: Include `cffparse.h'.
-       Updated.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Old Turkic data.
 
-       * src/cff/cffobjs.c (cff_face_done): Updated.
+2017-04-08  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       * src/cff/cffparse.c: Include `cffload.h'.
-       (cff_parse_num): Handle internal value 255.
-       (cff_parse_vsindex, cff_parse_blend): New functions.
-       (CFF_FIELD_BLEND): New macro.
-       (cff_parser_run): Updated.
-       * src/cff/cffparse.h (cff_kind_blend): New enum value.
+       [autofit] Add support for Gothic script.
 
-       * src/cff/cfftoken.h: Handle `vstore', `vsindex', and `blend'
-       dictionary values.
+       * src/autofit/afblue.dat: Add blue zone data for Gothic.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       * src/cff/cfftypes.h (CFF_VarData, CFF_AxisCoords, CFF_VarRegion,
-       CFF_VStore, CFF_Blend): New structures.
-       (CFF_FontRecDict): Add `vstore_offset' field.
-       (CFF_Private): Add `vsindex' field.
-       (CFF_SubFont): Add fields for blend data.
-       (CFF_Font): Add `vstore' field.
+       * src/autofit/afscript.h: Add Gothic standard characters.
 
-       * src/truetype/ttgxvar.c (TT_Get_MM_Var): `CFF2' is equal to `gvar',
-       since glyph variation data is directly embedded.
-       (TT_Set_MM_Blend): Don't load `gvar' table for CFF2 fonts.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Gothic data.
 
-2016-12-15  Dave Arnold  <darnold@adobe.com>
-           Werner Lemberg  <wl@gnu.org>
+2017-04-08  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       [cff] Implement CFF2 support (1/2).
+       [autofit] Add support for Cypriot script.
 
-       This commit does not contain the blend code for font variation
-       support, which follows in another commit.
+       * src/autofit/afblue.dat: Add blue zone data for Cypriot.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       You should ignore whitespace while inspecting this commit.
+       * src/autofit/afscript.h: Add Cypriot standard characters.
 
-       * include/freetype/internal/tttypes.h (TT_Face): Add `isCFF2'
-       member.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Cypriot data.
 
-       * src/cff/cf2font.h (CF2_Font): Add `isCFF2' member.
+2017-04-08  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       * src/cff/cf2ft.c (cf2_decoder_parse_charstrings): Handle `isCFF2'
-       flag.
-       (cf2_getMaxstack): New function.
-       * src/cff/cf2ft.h: Updated.
+       [autofit] Add support for Deseret script.
 
-       * src/cff/cf2intrp.c (cf2_escRESERVED_38): New enum.
-       (cf2_interpT2CharString): Handle CFF2 differences.
-       Add tracing message for errors.
+       * src/autofit/afblue.dat: Add blue zone data for Deseret.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       * src/cff/cffdrivr.c (cff_get_glyph_name, cff_get_name_index):
-       Update for CFF2.
+       * src/autofit/afscript.h: Add Deseret standard characters.
 
-       * src/cff/cffload.c (FT_FIXED_ONE): New macro.
-       (cff_index_init, cff_index_load_offsets, cff_index_access_element,
-       cff_index_get_name, cff_ft_select_get, cff_load_private_dict,
-       cff_subfont_load, cff_font_load): Handle CFF2.
-       * src/cff/cffload.h: Updated.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Deseret data.
 
-       * src/cff/cffobjs.c (cff_face_init): Handle CFF2.
+2017-04-07  Werner Lemberg  <wl@gnu.org>
 
-       * src/cff/cffparse.c (cff_parse_maxstack): New function.
-       (CFFCODE_TOPDICT, CFFCODE_PRIVATE): Removed
-       * src/cff/cffparse.h (CFF2_MAX_STACK, CFF2_DEFAULT_STACK): New
-       macros.
-       (CFF2_CODE_TOPDICT, CFF2_CODE_FONTDICT, CFF2_CODE_PRIVATE): New
-       macros.
+       [autofit] Fix invalid character range description (#50745).
 
-       * src/cff/cfftoken.h: Add fields for CFF2 dictionaries (but no blend
-       stuff).
+       Also reported as
 
-       * src/cff/cfftypes.h (CFF_Index): Add `hdr_size' field.
-       (CFF_FontRecDict): Add `maxstack' field.
-       (CFF_Private): Add `subfont' field.
-       (CFF_Font): Add `top_dict_length' and `cff2' fields.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=1034
 
-       * src/sfnt/sfobjs.c (sfnt_load_face): Handle `CFF2' table.
+       * src/autofit/afranges.c (af_glag_nonbase_uniranges): Fix typo in
+       recent commit.
 
-2016-12-15  Werner Lemberg  <wl@gnu.org>
-           Dave Arnold  <darnold@adobe.com>
+2017-04-07  Werner Lemberg  <wl@gnu.org>
 
-       [truetype] Provide HVAR advance width variation as a service.
+       [ftfuzzer] Fix clang warnings.
 
-       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+       * src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Add
+       casts.
 
-       * src/truetype/ttdriver.c (tt_service_metrics_variations): Updated.
+2017-04-06  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Prevent
-       double adjustment of advance width.
+       [autofit] Add support for Lisu script.
 
-       * src/sfnt/ttmtx.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
-       (tt_face_get_metrics): Apply metrics variations.
+       * src/autofit/afblue.dat: Add blue zone data for Lisu.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-2016-12-15  Dave Arnold  <darnold@adobe.com>
-           Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afscript.h: Add Lisu standard characters.
 
-       [truetype] Provide function to apply `HVAR' advance width variation.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Lisu data.
 
-       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+2017-04-06  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       * src/truetype/ttgxvar.c (tt_hadvance_adjust): New function.
-       * src/truetype/ttgxvar.h: Updated.
+       [autofit] Add support for Osage script.
 
-2016-12-15  Dave Arnold  <darnold@adobe.com>
-           Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afblue.dat: Add blue zone data for Osage.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       [truetype] Add `HVAR' table parsing.
+       * src/autofit/afscript.h: Add Osage standard characters.
 
-       Note that this is not complete yet; it only handles advance width
-       variation.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Osage data.
 
-       Activation of the code follows in another commit.
+2017-04-06  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+       [autofit] Add support for Glagolitic script.
 
-       * include/freetype/ftmm.h (FT_Var_Named_Style): Add `psid' member.
+       * src/autofit/afblue.dat: Add blue zone data for Glagolitic.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       * src/truetype/ttgxvar.h (GX_HVarData, GX_AxisCoords, GX_HVarRegion,
-       GX_HVStore, GX_WidthMap): New auxiliary structures for...
-       (GX_HVarTable): ... HVAR main structure.
-       (GX_BlendRec): Add data for HVAR loading.
+       * src/autofit/afscript.h: Add Glagolitic standard characters.
 
-       * src/truetype/ttgxvar.c (FT_FIXED_ONE, FT_fdot14ToFixed,
-       FT_intToFixed, FT_fixedToInt): New macros.
-       (ft_var_load_hvar): New function.
-       (TT_Get_MM_Var): Updated.
-       (tt_done_blend): Deallocate HVAR data.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Glagolitic data.
 
-2016-12-15  Dave Arnold  <darnold@adobe.com>
+2017-04-06  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       [cff] Extend number parsing.
+       [autofit] Add support for Tai Viet script.
 
-       The forthcoming CFF2 support needs a dynamic parsing limit.
+       * src/autofit/afblue.dat: Add blue zone data for Tai Viet.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       * src/cff/cffparse.c (cff_parse_num, do_fixed, cff_parse_fixed,
-       cff_parse_fixed_scaled, cff_parse_fixed_dynamic): Add argument for
-       parser.
-       (cff_parse_font_matrix, cff_parse_font_bbox, cff_parse_private_dict,
-       cff_parse_multiple_master, cff_parse_cid_ros, cff_parser_run): Updated.
+       * src/autofit/afscript.h: Add Tai Viet standard characters.
 
-       * src/cff/cffparse.h (cff_parse_num): Export locally.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Tai Viet data.
 
-2016-12-15  Dave Arnold  <darnold@adobe.com>
+2017-04-06  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       [cff] Implement dynamic stack size for Adobe engine.
+       [autofit] Add support for Tifinagh script.
 
-       This also adds `cf2_stack_setReal' and `cf2_stack_pop', needed for
-       the forthcoming CFF2 support.
+       * src/autofit/afblue.dat: Add blue zone data for Tifinagh.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       * src/cff/cf2stack.c (cf2_stack_init): Add argument for stack size.
-       (cf2_stack_free): Deallocate stack.
-       (cf2_stack_count, cf2_stack_pushInt, cf2_stack_pushFixed,
-       cf2_stack_popInt, cf2_stack_popFixed, cf2_stack_getReal,
-       cf2_stack_clear): Updated.
-       (cf2_stack_setReal, cf2_stack_pop): New functions.
+       * src/autofit/afscript.h: Add Tifinagh standard characters.
 
-       * src/cff/cf2stack.h (CF2_Stack): Add `stackSize' member.
-       Update function declarations.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Tifinagh data.
 
-       * src/cff/cf2intrp.c (cf2_interpT2CharString): Updated.
+2017-04-06  Sascha Brawer  <sascha@google.com>
+           Werner Lemberg  <wl@gnu.org
 
-       * src/cff/cffparse.c (cff_parser_init): Add parameter for stack
-       size; return error code.
-       (cff_parser_done): New function.
-       (cff_parser_run): Updated.
+       [autofit] Add support for N'Ko script.
 
-       * src/cff/cffparse.h (CFF_Parser): Add `stackSize' member and make
-       `stack' a pointer.
-       Update function declarations.
+       * src/autofit/afblue.dat: Add blue zone data for N'Ko.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       * src/cff/cffload.c (cff_load_private_dict, cff_subfont_load):
-       Updated.
+       * src/autofit/afscript.h: Add N'Ko standard characters.
 
-2016-12-15  Dave Arnold  <darnold@adobe.com>
-           Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add N'Ko data.
 
-       [cff] Code shuffling.
+2017-04-06  Sascha Brawer  <sascha@google.com>
 
-       * src/cff/cfftypes.h (CFF_Font): Add `library' and `base_offset'
-       fields.
+       [autofit] Add support for Adlam script.
 
-       * src/cff/cffload.c (cff_subfont_load): Change last argument to
-       `CFF_Font'
-       Split off parsing of private dictionary into...
-       (cff_load_private_dict): ...this new function.
-       (cff_font_load): Updated.
+       * src/autofit/afblue.dat: Add blue zone data for Adlam.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-2016-12-14  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afscript.h: Add Adlam standard characters.
 
-       [sfnt, truetype] Add framework for Metrics Variations service.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Adlam data.
 
-       No effect yet; service functions will be implemented later on.
+2017-04-06  Sascha Brawer  <sascha@google.com>
 
-       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+       [autofit] Add support for Ol Chiki script.
 
-       * include/freetype/internal/services/svmetric.h: New file.
+       * src/autofit/afblue.dat: Add blue zone data for Ol Chiki.
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
 
-       * include/freetype/internal/ftserv.h
-       (FT_SERVICE_METRICS_VARIATIONS_H): New macro.
+       * src/autofit/afscript.h: Add Ol Chiki standard character.
 
-       * include/freetype/internal/tttypes.h (TT_Face): New field `var'.
+       * src/autofit/afranges.c, src/autofit/afstyles.h: Add Ol Chiki data.
 
-       * src/sfnt/sfobjs.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
-       (sfnt_init_face): Initialize `face->var'.
+2017-04-03  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttdriver.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
-       (tt_service_metrics_variations): New service.
-       (tt_services): Updated.
+       [truetype] Avoid reexecution of `fpgm' and `prep' in case of error.
 
-       * src/truetype/ttpic.h: Updated.
+       Reported as
 
-2016-12-14  Werner Lemberg  <wl@gnu.org>
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=981
 
-       [cff] Add Multiple Masters service.
+       * include/freetype/fterrdef.h (FT_Err_DEF_In_Glyf_Bytecode): New
+       error code.
 
-       The code simply uses the MM functions from the `truetype' module.
+       * src/truetype/ttinterp.c (Ins_FDEF, Ins_IDEF): Prohibit execution
+       of these two opcodes in `glyf' bytecode.
+       (TT_RunIns): Don't enforce reexecution of `fpgm' and `prep' bytecode
+       in case of error since function tables can no longer be modified
+       (due to the changes in `Ins_FDEF' and `Ins_IDEF').  This change can
+       enormously speed up handling of broken fonts.
 
-       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+2017-04-02  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * include/freetype/internal/tttypes.h (TT_Face): New field `mm'.
+       [autofit] Disable metrics adjustment for `FT_LOAD_TARGET_LCD'.
 
-       * src/cff/cffdrivr.c: Include FT_SERVICE_MULTIPLE_MASTERS_H.
-       (cff_set_mm_blend, cff_get_mm_blend, cff_get_mm_var,
-       cff_set_var_design, cff_get_var_design): New functions.
-       (cff_service_multi_masters): New service.
-       (cff_services): Updated.
+       * src/autofit/aflatin.c (af_latin_hints_init): Updated.
+       * src/autofit/aflatin2.c (af_latin2_hints_init): Ditto.
 
-       * src/cff/cffload.c (cff_get_var_blend, cff_done_blend): New
-       functions.
-       * src/cff/cffload.h: Updated.
+2017-04-01  Werner Lemberg  <wl@gnu.org>
 
-       * src/cff/cffpic.h (CFF_SERVICE_MULTI_MASTERS_GET): New macro.
+       * src/truetype/ttgload.c: Include FT_CONFIG_CONFIG_H.
 
-       * src/sfnt/sfobjs.c: Include FT_SERVICE_MULTIPLE_MASTERS_H.
-       (sfnt_init_face): Initialize `face->mm'.
+       Otherwise FT_UINT_TO_POINTER might not be defined.
 
-2016-12-14  Werner Lemberg  <wl@gnu.org>
+       Problem reported by Alexei.
 
-       Extend functionality of `ft_module_get_service'.
+2017-03-31  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       It can now differentiate between local and global searches.
+       [autofit] Disable stem adjustment for `FT_LOAD_TARGET_LCD'.
 
-       * src/base/ftobjs.c (ft_module_get_service): Add `global' argument.
-       (FT_Get_TrueType_Engine_Type): Updated.
+       * include/freetype/freetype.h (FT_LOAD_TARGET_LCD): Document it.
+       * src/autofit/afcjk.c (af_cjk_hints_init): Updated.
+       * src/autofit/aflatin.c (af_latin_hints_init): Ditto.
+       * src/autofit/aflatin2.c (af_latin2_hints_init): Ditto.
 
-       * src/cff/cffdrivr.c (cff_get_ps_name, cff_get_cmap_info): Updated.
+2017-03-31  Werner Lemberg  <wl@gnu.org>
 
-       * include/freetype/internal/ftobjs.h: Updated.
-       * include/freetype/internal/ftserv.h (FT_FACE_FIND_GLOBAL_SERVICE):
-       Updated.
+       * src/cff/cffload.c (cff_font_load): Improve fix from 2017-01-04.
 
-2016-12-14  Werner Lemberg  <wl@gnu.org>
+       Allow CFFs containing a single font to have an empty font name.
 
-       * src/truetype/ttgxvar.c (tt_get_var_blend): Fix compiler warning.
+       Problem reported by 張俊芝 <418092625@qq.com> in
 
-2016-12-14  Dave Arnold  <darnold@adobe.com>
-           Werner Lemberg  <wl@gnu.org>
+         https://lists.nongnu.org/archive/html/freetype-devel/2017-03/msg00074.html
 
-       [sfnt, cff] Minor preparations.
+2017-03-30  Werner Lemberg  <wl@gnu.org>
 
-       * include/freetype/tttags.h (TTAG_CFF2, TTAG_HVAR, TTAG_MVAR,
-       TTAG_VVAR): New SFNT table tags.
+       * src/cff/cffparse.h (CFF2_DEFAULT_STACK): Set to 513 also.
 
-       * src/cff/cf2fixed.h (CF2_FIXED_ONE, CF2_FIXED_EPSILON): Add cast.
+       Requested by Dave Arnold.
 
-2016-12-10  Werner Lemberg  <wl@gnu.org>
+2017-03-30  Werner Lemberg  <wl@gnu.org>
 
-       [truetype, type1] Add `get_var_blend' to MM service.
+       [truetype] Fix HVAR and VVAR handling (#50678).
 
-       For internal use; we want to share code between the forthcoming CFF2
-       support and TrueType.
+       * src/truetype/ttgxvar.c (tt_hvadvance_adjust): Handle
+       glyph indices larger than `mapCount' as described in the
+       specification.
 
-       * include/freetype/internal/services/svmm.h (FT_Get_Var_Blend_Func):
-       New typedef.
-       (MultiMasters): Add `get_var_blend'.
-       (FT_Service_MultiMasters): Updated.
+2017-03-30  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttgxvar.c (tt_get_var_blend): New function.
-       * src/truetype/ttgxvar.h: Updated.
+       [truetype] Allow linear scaling for unhinted rendering (#50470).
 
-       * src/truetype/ttdriver.c (tt_service_gx_multi_masters): Updated.
-       * src/type1/t1driver.c (t1_service_multi_masters): Updated.
+       * src/truetype/ttdriver.c (tt_size_request): Revert change from
+       2011-07-16; the intended metrics fix seems now to be implemented in
+       a different way, making the patch unnecessary.  Note that this
+       change was usually patched out by all major GNU/Linux distributions
+       due to heavy side effects.
 
-2016-12-10  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttgload.c (compute_glyph_metrics, TT_Load_Glyph):
+       Refer to the metrics of the `TT_Size' object.
 
-       [truetype, type1] Add `done_blend' to MM service.
+2017-03-29  Werner Lemberg  <wl@gnu.org>
 
-       For internal use; we want to share code between the forthcoming CFF2
-       support and TrueType.
+       [truetype] Fix thinko related to PS name of default named instance.
 
-       * include/freetype/internal/services/svmm.h (FT_Done_Blend_Func):
-       New typedef.
-       (MultiMasters): Add `done_blend'.
-       (FT_Service_MultiMasters): Updated.
+       * src/truetype/ttgxvar.c (TT_Get_MM_Var): `strid' and `psid' are
+       name ID values, not indices into the array of name entries.
 
-       * src/truetype/ttgxvar.c (tt_done_blend): Use `TT_Face' as argument.
-       * src/truetype/ttgxvar.h: Updated.
+2017-03-27  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttobjs.c (TT_Face_Done): Updated.
+       [cid, truetype] Don't use `index' as a variable name.
 
-       * src/truetype/ttdriver.c (tt_service_gx_multi_masters): Updated.
-       * src/type1/t1driver.c (t1_service_multi_masters): Updated.
+       At least on FreeBSD there is a global declaration of `index' in file
+       `/usr/include/strings.h'.
 
-2016-12-09  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cf2intrp.c, src/truetype/ttgload.c: s/index/idx/ where
+       appropriate.
 
-       [sfnt] Revert change from 2016-12-08.
+2017-03-27  Wojciech Mamrak  <wmamrak@gmail.com>
 
-       I missed the functionality of `ft_module_get_service', which makes
-       the change unnecessary.
+       [sfnt] Minor improvement for handling kern tables.
 
-2016-12-08  Werner Lemberg  <wl@gnu.org>
+       * src/sfnt/ttkern.c (tt_face_load_kern): Don't check for
+       cross-stream kerning tables since we reject format 2 tables later
+       on anyways.
+       Modify code for limit test...
+       (tt_face_get_kerning): ... to avoid a limit test here.
 
-       Add framework to support services with 8 functions.
+2017-03-27  Werner Lemberg  <wl@gnu.org>
 
-       We will need this for CFF variation font support.
+       [pcf] Fix compiler warnings.
 
-       * include/freetype/internal/ftserv.h (FT_DEFINE_SERVICEDESCREC8):
-       New macro.
+       Reported by Alexander Hedges <ahedges@student.ethz.ch>.
 
-2016-12-08  Werner Lemberg  <wl@gnu.org>
+       * src/pcf/pcfdrivr.c (pcf_property_set, pcf_property_get): Tag
+       `property_name' with `FT_UNUSED' where necessary.
 
-       [sfnt] Add `get_glyph_name' and `get_name_index' to SFNT interface.
+2017-03-26  Werner Lemberg  <wl@gnu.org>
 
-       CFF2 fonts will need access to those two functions.
+       * src/psaux/psobjs.c (t1_builder_close_contour): Add safety guard.
 
-       * include/freetype/internal/sfnt.h: Include FT_SERVICE_GLYPH_DICT_H.
-       (SFNT_Interface): Add `get_glyph_name' and `get_name_index' members.
-       (FT_DEFINE_SFNT_INTERFACE): Updated.
+       Reported as
 
-       * src/sfnt/sfdriver.c (sfnt_get_glyph_name, sfnt_get_name_index):
-       Fix signatures to exactly correspond to the glyph dict service
-       function typedefs.
-       (sfnt_interface): Updated.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=941
 
-2016-12-06  Dave Arnold  <darnold@adobe.com>
+2017-03-23  Werner Lemberg  <wl@gnu.org>
 
-       Add `FT_Get_Var_Design_Coordinates' function.
+       [psaux] Better protect `flex' handling.
 
-       Note that the low-level functions aren't implemented yet.
+       Reported as
 
-       * include/freetype/ftmm.h: Declare.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=935
 
-       * include/freetype/internal/services/svmm.h
-       (FT_Get_Var_Design_Func): New typedef.
-       (MultiMasters): New MM service function `get_var_design'.
-       (FT_DEFINE_SERVICE_MULTIMASTERSREC): Updated.
-       Update all callers.
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings)
+       <callothersubr>: Since there is not a single flex operator but a
+       series of subroutine calls, malformed fonts can call arbitrary other
+       operators after the start of a flex, possibly adding points.  For
+       this reason we have to check the available number of points before
+       inserting a point.
 
-       * src/base/ftmm.c (FT_Get_Var_Design_Coordinates): Implement.
+2017-03-23  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttdriver.c: Updated.
+       [sfnt] Fix check for default named instance.
 
-       * src/truetype/ttgxvar.c (TT_Get_Var_Design): New dummy function to
-       handle `get_var_design' service.
-       * src/truetype/ttgxvar.h: Updated.
+       * src/sfnt/sfobjs.c (sfnt_init_face): A `fixed' number needs four
+       bytes, not two...
 
-       * src/type1/t1driver.c: Updated.
+2017-03-23  Werner Lemberg  <wl@gnu.org>
 
-       * src/type1/t1load.c (T1_Get_Var_Design): New dump function to
-       handle `get_var_design' service.
-       * src/type1/t1load.h: Updated.
+       Make MM fonts work (again).
 
-2016-12-06  Werner Lemberg  <wl@gnu.org>
+       * src/base/ftmm.c (FT_Set_Var_Design_Coordinates,
+       FT_Set_MM_Blend_Coordinates, FT_Set_Var_Blend_Coordinates): Ignore
+       return value of `ft_face_get_mvar_service'; instead, check whether a
+       service is actually returned.
 
-       * src/type1/t1load.c (parse_subrs): Fix memory leak.
+2017-03-20  Werner Lemberg  <wl@gnu.org>
 
-       The `subrs' keyword might erroneously occur multiple times.
+       [truetype] Some variable renamings.
 
-       Reported as
+       Too much local variables holding different structures were called
+       `metrics'.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=231
+       * src/truetype/ttdriver.c (tt_size_select): s/metrics/size_metrics/.
 
-2016-12-01  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttgload.c (tt_get_metrics_incr_overrides,
+       compute_glyph_metrics): s/metrics/incr_metrics/.
+       (load_sbit_image): s/metrics/sbit_metrics/.
 
-       [gzip] Improve building with external zlib (#49673).
+       * src/truetype/ttobjs.c (tt_size_run_fpgm): s/metrics/size_metrics/.
+       (tt_size_init_bytecode): s/metrics/tt_metrics/.
+       (tt_size_reset): s/metrics/size_metrics/.
 
-       Building FreeType with external zlib 1.2.8 makes msvc 14 stop with
-       the following error.
+2017-03-20  Werner Lemberg  <wl@gnu.org>
 
-         ftgzip.c
-         zlib-1.2.8\zlib.h(86): error C2061:
-                                syntax error: identifier 'z_const'
-         zlib-1.2.8\zlib.h(94): error C2054:
-                                expected '(' to follow 'z_const'
-         zlib-1.2.8\zlib.h(94): error C2085:
-                                'msg': not in formal parameter list
-         ...
-         zlib-1.2.8\zlib.h(877): fatal error C1003:
-                                 error count exceeds 100; stopping compilation
+       [sfnt] Don't add instances to non-variation fonts.
 
-       The error happens because FreeType keeps an own copy of zlib-1.1.4
-       under `src/gzip'.  When building `src/gzip/ftgzip.c' with
-       FT_CONFIG_OPTION_SYSTEM_ZLIB defined, it uses
+       * src/sfnt/sfobjs.c (sfnt_init_face): Fix it.
 
-         #include <zlib.h>
+2017-03-20  Werner Lemberg  <wl@gnu.org>
 
-       which correctly finds an external `zlib.h', but `zlib.h' itself has
-       a line
+       * src/cff/cffgload.c (cff_builder_init): Add safety guard (#50578).
 
-         #include "zconf.h"
+2017-03-18  Werner Lemberg  <wl@gnu.org>
 
-       which makes Visual Studio 2015 find `src/gzip/zconf.h' while
-       compiling the files in `src/gzip'.
+       Introduce FT_UINT_TO_POINTER macro (#50560).
 
-       * src/gzip/zconf.h: Rename to...
-       * src/gzip/ftzconf.h: ... this.
-       * src/gzip/zlib.h, src/gzip/rules.mk (GZIP_DRV_SRCS): Updated.
+       We have to make a separate case for Windows 64's LLP64 data model.
 
-2016-12-01  Oleksandr Chekhovskyi  <oleksandr.chekhovskyi@gmail.com>
+       * builds/unix/ftconfig.in, builds/vms/ftconfig.h,
+       include/freetype/config/ftconfig.h (FT_UINT_TO_POINTER): New macro.
 
-       [autofit] Fix Emscripten crash (patch #9180).
+       * src/truetype/ttgload.c (load_truetype_glyph): Use it.
 
-       Function calls through pointers must use a matching signature to
-       work on Emscripten, since such calls are dispatched through lookup
-       tables grouped by signature.
+2017-03-18  Werner Lemberg  <wl@gnu.org>
 
-       * src/autofit/aftypes.h (AF_WritingSystem_ApplyHintsFunc): Fix
-       typedef.
+       * src/truetype/ttinterp.c (TT_RunIns): Adjust loop counter (#50573).
 
-2016-11-29  Werner Lemberg  <wl@gnu.org>
+       The problematic font that exceeds the old limit is Lato-Regular,
+       version 2.007, containing bytecode generated by a buggy version of
+       ttfautohint.
 
-       [smooth] Revert previous commit.  Already fixed with 6ca54c64.
+2017-03-18  Werner Lemberg  <wl@gnu.org>
 
-2016-11-29  Werner Lemberg  <wl@gnu.org>
+       [truetype] Another limitation for bytecode loop count maximum.
 
-       [smooth] Avoid conditional jump on uninitialized value (#49711).
+       Reported as
 
-       * src/smooth/ftgrays.c (gray_raster_render): Initialize `worker'.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=900
 
-2016-11-27  Nikolaus Waxweiler  <madigens@gmail.com>
+       * src/truetype/ttinterp.c (TT_RunIns): Limit `loopcall_counter_max'
+       by number of glyphs also.
 
-       [autofit] Code shuffling.
+2017-03-18  Werner Lemberg  <wl@gnu.org>
 
-       Also improve some comments and remove unused code.
+       [ftfuzzer] Minor improvement.
 
-       No functional change.
+       * src/tools/ftfuzzer/ftfuzzer.cc: Don't set intermediate axis if
+       bitmap strikes are active.
 
-       * src/autofit/afloader.c (af_loader_load_g): Merged with...
-       (af_loader_load_glyph): ...this function.
-       Split off emboldening code into...
-       (af_loader_embolden_glyph_in_slot): ... this function.
+2017-03-18  Werner Lemberg  <wl@gnu.org>
 
-2016-11-17  Werner Lemberg  <wl@gnu.org>
+       Improve `make multi'.
 
-       Better support of LLP64 systems with gcc (and clang).
+       * src/autofit/aflatin2.c: Guard file with FT_OPTION_AUTOFIT2.
 
-       * builds/unix/configure.raw: Call `AC_TYPE_LONG_LONG_INT'.
+       * src/base/ftmac.c: Guard more parts of the file with FT_MACINTOSH.
 
-       * builds/unix/ftconfig.in (FT_LONG64): Enable for LLP64 systems (and
-       suppress warnings) even without `FT_CONFIG_OPTION_FORCE_INT64'.
+       * src/psaux/afmparse.c: Guard file with T1_CONFIG_OPTION_NO_AFM.
 
-2016-11-10  Werner Lemberg  <wl@gnu.org>
+       * src/sfnt/pngshim.c: Guard file with
+       TT_CONFIG_OPTION_EMBEDDED_BITMAPS also.
 
-       Fix `lcd_weights' array size.
+       * src/sfnt/ttbdf.c: Avoid empty source file.
+       * src/sfnt/ttpost.c: Guard file with
+       TT_CONFIG_OPTION_POSTSCRIPT_NAMES.
+       * src/sfnt/ttsbit.c: Guard file with
+       TT_CONFIG_OPTION_EMBEDDED_BITMAPS.
 
-       * include/freetype/internal/ftobjs.h (FT_LibraryRec): Do it.
+       * src/truetype/ttgxvar.c, src/truetype/ttinterp.c: Avoid empty
+       source file.
 
-       Reported by Nikolaus.
+       * src/truetype/ttsubpix.c: Guard file with
+       TT_USE_BYTECODE_INTERPRETER also.
 
-2016-11-06  Werner Lemberg  <wl@gnu.org>
+       * src/type1/t1afm.c: Guard file with T1_CONFIG_OPTION_NO_AFM.
 
-       * src/base/ftobjs.c (FT_Render_Glyph_Internal): Fix tracing.
+       * src/autofit/autofit.c, src/base/ftbase.c, src/cache/ftcache.c,
+       src/cff/cff.c, src/cid/type1cid.c, src/gxvalid/gxvalid.c,
+       src/pcf/pcf.c, src/pfr/pfr.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: Remove conditionals; sort
+       entries.
 
-2016-11-06  Werner Lemberg  <wl@gnu.org>
+2017-03-17  Werner Lemberg  <wl@gnu.org>
 
-       [sfnt] Improve FT_LOAD_BITMAP_METRICS_ONLY for `sbix' format.
+       Fixes for conditional compilation.
 
-       It's unavoidable to call the PNG engine, but to get the metrics it
-       is sufficient to read the PNG image's header only.
+       * src/autofit/afcjk.c, src/autofit/afindic.c: Include `afcjk.h'
+       earlier.
 
-       * src/sfnt/pngshim.c (Load_SBit_Png): Add argument to control the
-       allocation of the glyph slot.
-       * src/sfnt/pngshim.h: Updated.
-       * src/sfnt/ttsbit.c (tt_sbit_decoder_load_png,
-       tt_face_load_sbix_image, tt_face_load_sbit_image): Updated.
+       * src/sfnt/sfobjs.c (sfnt_init_face): Put `memory' variable into
+       TT_CONFIG_OPTION_GX_VAR_SUPPORT block.
+       (sfnt_done_face): Protect some code with
+       TT_CONFIG_OPTION_GX_VAR_SUPPORT.
 
-2016-11-06  Werner Lemberg  <wl@gnu.org>
+       * src/sfnt/ttsbit.c (tt_face_load_sbix_image): Remove compiler
+       warning.
 
-       [sfnt] Speed up `sbix' lookup.
+       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Put `tmp' variable
+       into TT_USE_BYTECODE_INTERPRETER block.
 
-       This also fixes a bug introduced in 2016-10-01 which prevents
-       display of embedded bitmap fonts that use the `sbix' format.
+       (tt_loader_init): Put `error' variable into
+       TT_USE_BYTECODE_INTERPRETER block.
 
-       * src/sfnt/ttsbit.c (tt_face_load_sbit): Store `sbix' size and
-       offset also in `ebdt_size' and `ebdt_start', respectively.  This
-       makes the test for an embedded bitmap data table succeed for this
-       format.
+2017-03-17  Werner Lemberg  <wl@gnu.org>
 
-       (tt_face_load_strike_metrics) <TT_SBIT_TABLE_TYPE_SBIX>: Use
-       `ebdt_size' and `ebdt_start'
-       (tt_face_load_sbix_image): Ditto.
+       Fix preprocessor warning.
 
-2016-11-06  Seigo Nonaka  <nona@google.com>
-           Werner Lemberg  <wl@gnu.org>
+       * devel/ftoption.h, include/freetype/config/ftoption.h: Test whether
+       TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined before checking its
+       value.
 
-       Introduce a way of quickly retrieving (embedded) bitmap metrics.
+2017-03-17  Werner Lemberg  <wl@gnu.org>
 
-       `FT_Load_Glyph' doesn't generate a bitmap for a non-bitmap glyph
-       until the user calls `FT_Render_Glyph'.  However, it always
-       allocates memory for bitmaps and copies or decodes the contents of a
-       bitmap glyph, which can be quite slow for PNG data.
+       `make multi' fixes; compiler warnings.
 
-       * include/freetype/freetype.h (FT_LOAD_BITMAP_METRICS_ONLY): New
-       macro.
+       * src/base/ftsnames.c: Include FT_INTERNAL_DEBUG_H.
 
-       * src/base/ftobjs.c (FT_Load_Glyph): Unset FT_LOAD_RENDER if
-       FT_LOAD_BITMAP_METRICS_ONLY is used.
+       * src/cff/cffobjs.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
+       FT_MULTIPLE_MASTERS_H and FT_SERVICE_MULTIPLE_MASTERS_H.
 
-       * src/sfnt/ttsbit.c (tt_sbit_decoder_alloc_bitmap,
-       tt_sbit_decoder_load_bitmap): Add argument to control allocation of
-       the glyph slot.
-       (tt_sbit_decoder_load_image, tt_sbit_decoder_load_compound,
-       tt_face_load_sbit_image): Updated.
+       * src/sfnt/sfdriver.c [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Include
+       FT_MULTIPLE_MASTERS_H and FT_SERVICE_MULTIPLE_MASTERS_H.
+       (get_win_string, get_apple_string): Initialize `result'.
 
-       * src/pcf/pcfdrivr.c (PCF_Glyph_Load): Quickly exit if
-       `FT_LOAD_BITMAP_METRICS_ONLY' is set.
+2017-03-17  Dave Arnold <darnold@adobe.com>
 
-       * src/pfr/pfrsbit.c, src/pfr/pfrsbit.h (pfr_slot_load_bitmap): Add
-       argument to control allocation of the glyph slot.
-       * src/pfr/pfrobjs (pfr_slot_load): Updated.
+       [cff] Fix potential bugs in default NDV for CFF2.
 
-       * src/winfonts/winfnt.c (FNT_Load_Glyph): Ditto.
+       * src/cff/cffload.c (cff_blend_build_vector): Explicitly build blend
+       vector when `lenNDV' is zero; don't rely on zero-init.
+       Save `lenNDV' as part of cache key even when `lenNDV' is zero.
 
-       * docs/CHANGES: Updated.
+2017-03-17  Dave Arnold <darnold@adobe.com>
 
-2016-11-06  Werner Lemberg  <wl@gnu.org>
+       [cff] Fix CFF2 stack allocation.
 
-       Synchronize with gnulib (#49448).
+       * src/cff/cffparse.c (cff_parser_init) add 1 for operator.
 
-       * include/freetype/config/ftconfig.h, builds/unix/ftconfig.in,
-       builds/vms/ftconfig.h (FT_TYPEOF): Update code to use definition in
-       current version of `intprops.h'.
-       Other minor synchronization to reduce code differences between the
-       three files.
+2017-03-16  Werner Lemberg  <wl@gnu.org>
 
-2016-11-03  Behdad Esfahbod  <behdad@behdad.org>
+       * src/truetype/ttgxvar.c (tt_done_blend): Free `vvar_table'.
 
-       [truetype] Clamp variation requests to valid range.
+       Reported as
 
-       This is required by OpenType 1.8; it also avoids rounding surprises.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=883
 
-       * src/truetype/ttgxvar.c (TT_Set_Var_Design): Clamp design coordinates
-       outside of the allowed range to always stay within the range instead
-       of producing an error.
+2017-03-15  Werner Lemberg  <wl@gnu.org>
 
-2016-10-29  Werner Lemberg  <wl@gnu.org>
+       Remove clang compiler warnings (#50548).
 
-       [truetype] Remove clang warnings.
+       * include/freetype/internal/tttypes.h (TT_FaceRec): Make
+       `var_postscript_prefix_len' unsigned.
 
-       * src/truetype/ttinterp.h (TT_ExecContextRec): Using `FT_ULong' for
-       loop counter handling.
+       * src/autofit/afwarp.c (af_warper_compute_line_best): Remove
+       redundant assignment.
 
-       * src/truetype/ttinterp.c: Updated.
-       (Ins_SCANTYPE): Use signed constant.
-       (TT_RunIns): Ensure `num_twilight_points' is 16bit.
+       * src/cff/cffload.c (cff_subfont_load): Add casts.
 
-2016-10-27  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cffparse.c (cff_parse_blend): Remove redundant assignment.
 
-       [truetype] Fix commit from 2014-11-24.
+       * src/sfnt/sfdriver.c (fmix32, murmur_hash_3_128): Add `static'
+       keyword.
+       Add casts.
+       (fixed2float): Add cast.
+       (sfnt_get_var_ps_name): Make `p' always initialized.
+       Add casts.
 
-       Problem reported by Hin-Tak Leung  <htl10@users.sourceforge.net>.
+       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Add casts.
 
-       * src/truetype/ttpload.c (tt_face_load_hdmx): Fix file checking
-       logic.
+2017-03-15  Werner Lemberg  <wl@gnu.org>
 
-2016-10-26  Werner Lemberg  <wl@gnu.org>
+       [ftfuzzer] Limit number of tested faces and instances.
 
-       Add `FT_Get_{MM,Var}_Blend_Coordinates' functions.
+       This is inspired by the discussion in and analysis of
 
-       * include/freetype/ftmm.h: Declare.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=859
 
-       * include/freetype/internal/services/svmm.h (FT_Get_MM_Blend_Func):
-       New typedef.
-       (MultiMasters): New MM service function `get_mm_blend'.
-       (FT_DEFINE_SERVICE_MULTIMASTERSREC): Updated.
-       Update all callers.
+       * src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Use only
+       up to 20 face indices.
+       Use only up to 20 instance indices.
 
-       * src/base/ftmm.c (FT_Get_MM_Blend_Coordinates,
-       FT_Get_Var_Blend_Coordinates): Implement.
+2017-03-15  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttdriver.c: Updated.
+       * src/tools/ftfuzzer/ftfuzzer.cc: Improve readability; formatting.
 
-       * src/truetype/ttgxvar.c (TT_Get_MM_Blend): New function to handle
-       `get_mm_blend' service.
-       * src/truetype/ttgxvar.h: Updated.
+2017-03-14  Werner Lemberg  <wl@gnu.org>
 
-       * src/type1/t1driver.c: Updated.
+       [sfnt] Implement PS names for font instances [3/3].
 
-       * src/type1/t1load.c (T1_Get_MM_Blend): New function to handle
-       `get_mm_blend' service.
-       * src/type1/t1load.h: Updated.
+       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
 
-       * docs/CHANGES: Document.
+       * include/freetype/internal/tttypes.h (TT_FaceRec): New fields
+       `var_postscript_prefix' and `var_postscript_prefix_len'.
 
-2016-10-26  Werner Lemberg  <wl@gnu.org>
+       * src/sfnt/sfdriver.c: Include FT_TRUETYPE_IDS_H.
+       (sfnt_is_alphanumeric): New wrapperfunction for `ft_isalnum'.
+       (get_win_string, get_apple_string): Remove `const' from return
+       value.
+       (MAX_VALUE_DESCRIPTOR_LEN, MAX_PS_NAME_LEN): New macros.
+       (hexdigits): New array.
+       (sfnt_get_var_ps_name): New function, implementing Adobe TechNote
+       5902 to construct a PS name for a variation font instance.
+       (sfnt_get_ps_name): Call `sfnt_get_var_ps_name' for font instances.
 
-       * src/type1/t1load.c (parse_subrs): Fix limit check.
+       * src/sfnt/sfobjs.c (sfnt_done_face): Updated.
 
-       Reported as
+       * src/truetype/ttgxvar.c (tt_set_mm_blend): Reset
+       `face->postscript_name' to trigger recalculation for new instance
+       parameters.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=81
+2017-03-14  Werner Lemberg  <wl@gnu.org>
 
-2016-10-25  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       [sfnt] Implement PS names for font instances [2/3].
 
-       [cff] Correct cmap format reporting (#24819).
+       * src/sfnt/sfdriver.c (fix2float) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]:
+       New function to find the shortest representation of a 16.16
+       fractional number.
 
-       * src/cff/cffdrivr.c (cff_get_cmap_info): Throw an error on synthetic
-       charmap instead of guessing its format and language.
+2017-03-14  Werner Lemberg  <wl@gnu.org>
 
-2016-10-22  Werner Lemberg  <wl@gnu.org>
+       [sfnt] Implement PS names for font instances [1/3].
 
-       [truetype] Fix SCANTYPE instruction (#49394).
+       Add 128bit MurmurHash 3 function.
 
-       * src/truetype/ttinterp.c (Ins_SCANTYPE): Only use lower 16bits.
+       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
 
-2016-10-22  Werner Lemberg  <wl@gnu.org>
+       * src/sfnt/sfdriver.c (ROTL32): New macro.
+       (fmix32, murmur_hash_3_128): New functions.
 
-       [sfnt] Improve handling of invalid post 2.5 tables [#49393].
+2017-03-13  Werner Lemberg  <wl@gnu.org>
 
-       * src/sfnt/ttpost.c (load_format_25): We need at least a single
-       table entry.
+       [truetype] Ignore invalid MVAR tags.
 
-2016-10-14  Werner Lemberg  <wl@gnu.org>
+       Reported as
 
-       [truetype] Fix handling of `cvar' table data.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=838
 
-       Reported as
+       * src/truetype/ttgxvar.c (ft_var_load_mvar): Ignore value and emit
+       warning for invalid tags.
+       (tt_apply_mvar): Ignore invalid tags.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=53
+2017-03-12  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttgxvar.c (tt_face_vary_cvt): Ignore invalid CVT
-       indices.
+       [truetype] Store and use design coordinates also.
 
-2016-10-11  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/internal/services/svmm.h (FT_Get_Var_Blend_Func):
+       Add `normalizedcoords' argument.
 
-       [psaux] Fix handling of invalid flex subrs.
+       * src/truetype/ttgxvar.h (GX_BlendRec): Add `coords' field to store
+       the design coordinates of the current instance.
+       Updated.
 
-       Problem reported as
+       * src/truetype/ttgxvar.c (TT_Set_MM_Blend): Move functionality to...
+       (tt_set_mm_blend): ... New function.
+       Convert data in `normalizedcoords' array to `coords' array on
+       demand.
+       (TT_Set_Var_Design): Store argument data in `coords' array.
+       (TT_Get_Var_Design): Get data from `coords' array.
+       (tt_get_var_blend): Updated.
+       (tt_done_blend): Updated.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=52
+       * src/cff/cffload.c, src/cff/cffload.h (cff_get_var_blend): Updated.
 
-       * src/psaux/t1decode.c (t1_decoder_parse_charstrings)
-       <op_callothersubr>: Set `flex_state' after error checking.
+       * src/cff/cf2ft.c (cf2_getNormalizedVector): Updated.
 
-2016-10-11  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cffobjs.c (cff_face_init): Updated.
 
-       * src/truetype/ttgxvar.c (tt_done_blend): Fix deallocation.
+2017-03-12  Werner Lemberg  <wl@gnu.org>
 
-2016-10-08  Werner Lemberg  <wl@gnu.org>
+       src/truetype/ttgxvar.[ch]: s/avar_checked/avar_loaded/.
 
-       * src/cid/cidload.c (cid_face_open): Properly propagate `error'.
+2017-03-08  Werner Lemberg  <wl@gnu.org>
 
-2016-10-08  Werner Lemberg  <wl@gnu.org>
+       [sfnt] Another fix for buggy variation fonts.
 
-       [cid] Fix parsing of subr offsets.
+       Reported as
 
-       Bug introduced 2016-05-16.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=759
 
-       * src/cid/cidparse.c (cid_parser_new): Fix off-by-one error.
+       * src/sfnt/sfobjs.c (sfnt_init_face): While setting number of
+       instances to zero for `CFF' fonts table, ensure that there is no
+       `CFF2' present also (which gets priority).
 
-2016-10-01  Werner Lemberg  <wl@gnu.org>
+2017-03-07  Werner Lemberg  <wl@gnu.org>
 
-       [sfnt] Disable bitmap strikes if we don't have a bitmap data table.
+       [sfnt] Improve handling for buggy variation fonts.
 
-       * src/sfnt/ttsbit.c (tt_face_load_sbit): Check whether we have
-       a bitmap data table.
+       Reported as
 
-2016-10-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=738
 
-       [smooth] Remove impossibility.
+       * src/sfnt/sfobjs.c (sfnt_init_face): While setting number of
+       instances to zero for `CFF' fonts table, ensure that there is no
+       `glyf' table present also (which gets priority).
 
-       * src/smooth/ftgrays.c (TWorker): Rearrange fields.
-       (gray_convert_glyph): Remove impossible condition and clean up.
+2017-03-06  Werner Lemberg  <wl@gnu.org>
 
-2016-09-29  Werner Lemberg  <wl@gnu.org>
+       [sfnt, truetype] Always provide default instance.
 
-       [pcf] Enrich family name with foundry name and glyph width info.
+       As documented in the OpenType specification, an entry for the
+       default instance may be omitted in the named instance table.  In
+       particular this means that even if there is no named instance table
+       in the font we actually do have a named instance, namely the default
+       instance.
 
-       This is a very old patch from openSuSE (from 2006, submitted to
-       FreeType in 2011) that I forgot to apply.
+       For consistency, we always want the default instance in our list of
+       named instances.  If it is missing, we try to synthesize it.
 
-         https://build.opensuse.org/package/view_file/openSUSE:Factory/freetype2/freetype2-bitmap-foundry.patch
+       * src/sfnt/sfobjs.c (sfnt_init_face): Check whether the default
+       instance is in the table of named instances.  Otherwise adjust
+       number of instances.
 
-       Prepend the foundry name plus a space to the family name.  There are
-       many fonts just called `Fixed' which look completely different, and
-       which have nothing to do with each other.  When selecting `Fixed' in
-       KDE or Gnome one gets results that appear rather random, the style
-       changes often if one changes the size and one cannot select some
-       fonts at all.
+       * src/truetype/ttgxvar.c: Include FT_TRUETYPE_IDS_H.
+       (TT_Get_MM_Var): Use `face->root.style_flags' as the number of named
+       instances.
+       Sythesize a named instance entry if necessary.
+       (tt_done_blend): Free `normalized_stylecoords'.
 
-       We also check whether we have `wide' characters; all put together,
-       we get family names like `Sony Fixed' or `Misc Fixed Wide'.
+2017-03-05  Werner Lemberg  <wl@gnu.org>
 
-       * src/pcf/pcfread.c (pcf_load_font): Implement it.
+       [sfnt] Remove redundant code.
 
-       * docs/CHANGES: Document it.
+       * src/sfnt/sfobjs.c (sfnt_init_face): Remove second test for
+       `num_instances', which will always succeed.
 
-2016-09-29  Werner Lemberg  <wl@gnu.org>
+2017-03-04  Werner Lemberg  <wl@gnu.org>
 
-       [ftfuzzer] Speed up.
+       [sfnt] Add `get_name_id' service.
 
-       * src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Don't
-       check for embedded bitmaps if we have a non-default instance.
+       * include/freetype/internal/sfnt.h (TT_Get_Name_ID_Func): New
+       typedef.
+       (SFNT_Interface): Add `get_name_id' field.
+       (FT_DEFINE_SFNT_INTERFACE): Updated.
 
-2016-09-29  Werner Lemberg  <wl@gnu.org>
+       * src/sfnt/sfdriver.c (search_name_id): Rename to...
+       (sfnt_get_name_id): ... this.
+       (sfnt_get_ps_name, sfnt_interface): Updated.
 
-       [truetype] Disallow bitmap strikes for non-default instances.
+2017-03-04  Werner Lemberg  <wl@gnu.org>
 
-       Also speed up access of default instances if GX variations are
-       active.
+       [truetype] Make `TT_Set_MM_Blend' set named instance index.
 
-       * include/freetype/internal/tttypes.h (TT_FaceRec): Add
-       `is_default_instance' member.
+       * src/truetype/ttgxvar.h (GX_Blend): New array
+       `normalized_stylecoords'.
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): Initialize
-       `is_default_instance'.
+       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Allocate and fill
+       `normalized_stylecoords'.
+       (TT_Set_MM_Blend): Check instance tuple and adjust `face_index'
+       accordingly.
 
-       * src/truetype/ttgload.c (TT_Process_Simple_Glyph,
-       load_truetype_glyph): Add test for default instance.
-       (TT_Load_Glyph): Load embedded bitmaps for default instance only.
+2017-03-02  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttgxvar.c (TT_Set_MM_Blend): Compute
-       `is_default_instance'.
+       [truetype] Split off designer/normalized conversion routines.
 
-2016-09-29  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttgxvar.c (TT_Set_Var_Design): Split off conversion
+       code designer->normalized coordinates to...
+       (ft_var_to_normalized): ... New function.
+       (TT_Get_Var_Design): Split off conversion code normalized->designer
+       coordinates to...
+       (ft_var_to_design): ... New function.
 
-       [truetype] Clean up `TT_Face' structure.
+2017-02-28  Werner Lemberg  <wl@gnu.org>
 
-       * include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
-       fields `horz_metrics' and `vert_metrics'.
-       Update documentation.
+       [sfnt] Further generalize `sfnt_get_ps_name'; report invalid data.
 
-       * src/sfnt/sfobjs.c (sfnt_done_face): Updated.
+       * src/sfnt/sfdriver.c (sfnt_ps_map): New array.
+       (sfnt_is_postscript): New function.
+       (char_type_func): New typedef.
+       (get_win_string, get_apple_string): Add argument to specify
+       character checking function.
+       Add argument whether argument checking failures should be reported.
+       Update callers.
+       (search_name_id): Fix return value.
 
-2016-09-28  Werner Lemberg  <wl@gnu.org>
+2017-02-23  Werner Lemberg  <wl@gnu.org>
 
-       More FT_ZERO usage.
+       [sfnt] Split off another bit of `sfnt_get_ps_name'.
 
-       * src/gxvalid/gxvcommn.c (gxv_ClassTable_validate):
-       s/ft_memset/FT_MEM_ZERO/.
+       * src/sfnt/sfdriver.c (sfnt_get_ps_name): Split off some
+       functionality into...
+       (search_name_id): ... New function.
 
-       * src/psaux/t1decode.c (t1_decoder_parse_charstrings):
-       s/ft_memset/FT_ARRAY_ZERO/.
+2017-02-23  Werner Lemberg  <wl@gnu.org>
 
-       * src/raster/ftraster.c (FT_ZERO): Define.
-       (ft_black_new): Use it.
-       * src/raster/ftrend1.c (ft_raster1_get_cbox):
-       s/FT_MEM_ZERO/FT_ZERO/.
+       [sfnt] Modularize `sfnt_get_ps_name'.
 
-       * src/smooth/ftgrays.c (FT_ZERO): Define.
-       (gray_raster_new): Use it.
-       * src/smooth/ftsmooth.c (ft_smooth_get_cbox):
-       s/FT_MEM_ZERO/FT_ZERO/.
+       * src/sfnt/sfdriver.c (sfnt_get_ps_name): Split off some
+       functionality into...
+       (IS_WIN, IS_APPLE): ... New macros.
+       (get_win_string, get_apple_string): ... New functions.
 
-2016-09-28  Werner Lemberg  <wl@gnu.org>
+2017-02-23  Werner Lemberg  <wl@gnu.org>
 
-       */*: s/FT_MEM_ZERO/FT_ZERO/ where appropriate.
+       [truetype] Minor improvement.
 
-2016-09-27  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttgload.c (TT_Process_Simple_Glyph,
+       load_truetype_glyph): Remove unnecessary tests.
 
-       [truetype] Trace number of executed opcodes.
+2017-02-23  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttinterp.c (TT_RunIns): Implement it.
+       * include/freetype/internal/tttypes.h (TT_Face): s/isCFF2/is_cff2/.
 
-2016-09-27  Werner Lemberg  <wl@gnu.org>
+       For orthogonality with other structure field names.
 
-       [truetype] Speed up `TT_Load_Glyph'.
+       Update all users.
 
-       This avoids additional calls to `tt_face_lookup_table' for the
-       `glyf' table, which can be expensive.
+2017-02-22  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * include/freetype/internal/tttypes.h (TT_LoaderRec): Move
-       `glyf_offset' field to ...
-       (TT_FaceRec): ... this structure.
-       * src/truetype/ttgload.c (load_truetype_glyph): Updated.
-       (tt_loader_init): Move initialization of `glyf_offset' to ...
-       * src/truetype/ttpload.c (tt_face_load_loca): ... this function.
+       * src/smooth/ftgrays.c (gray_hline): Improve code.
 
-2016-09-27  Werner Lemberg  <wl@gnu.org>
+2017-02-20  Dominik Röttsches  <drott@google.com>
 
-       [truetype] Introduce dynamic limits for some bytecode opcodes.
+       Fix some `ttnameid.h' entries (#50313).
 
-       This speeds up FreeType's handling of malformed fonts.
+       * include/freetype/ttnameid.h:
+       s/TT_MS_LANGID_SPANISH_INTERNATIONAL_SORT/TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT/,
+       s/TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIA/TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN/.
 
-       * src/truetype/ttinterp.c (TT_RunIns): Set up limits for the number
-       of twilight points, the total number of negative jumps, and the
-       total number of loops in LOOPCALL opcodes.  The values are based on
-       the number of points and entries in the CVT table.
-       (Ins_JMPR): Test negative jump counter.
-       (Ins_LOOPCALL): Test loopcall counter.
+2017-02-20  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttinterp.h (TT_ExecContext): Updated.
+       [cff] Finish support for `random' operator.
 
-       * docs/CHANGES: Updated.
+       * src/cff/cfftypes.h (CFF_SubFontRec): Add `random' field.
 
-2016-09-25  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cffobjs.c: Updated.
+       (cff_driver_init): Initialize random seed value.
 
-       [truetype] Sanitize only last entry of `loca' table.
+       * src/cff/cffload.c (cff_random): New function.
+       (cff_subfont_load): Add `face' argument.
+       Update all callers.
+       Initialize random number generator with a proper seed value.
+       (cff_font_load): Add `face' argument.
+       Update all callers.
 
-       Without this patch, a loca sequence like `0 100000 0 100000 ...',
-       where value 100000 is larger than the `glyf' table size, makes
-       FreeType handle the whole `glyf' table as a single glyph again and
-       again, which is certainly invalid (and can be very slow, too).
+       * src/cff/cffload.h: Updated.
 
-       * src/truetype/ttpload.c (tt_face_get_location): Implement.
-       Improve tracing messages.
+       * src/cff/cf2intrp.c (CF2_FIXME): Removed.
+       (cf2_interpT2CharString) <cf2_escRANDOM>: Implement opcode.
 
-2016-09-25  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cffgload.c (cff_decoder_parse_charstrings): Don't
+       initialize random seed value.
+       <cff_op_random>: Use new random seed framework.
 
-       * src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Fix typo.
+2017-02-20  Werner Lemberg  <wl@gnu.org>
 
-2016-09-24  Werner Lemberg  <wl@gnu.org>
+       [cff] Sanitize `initialRandomSeed'.
 
-       [autofit] Tracing fixes.
+       * src/cff/cffload.c (cff_load_private_dict): Make
+       `initial_random_seed' value always positive.
 
-       * src/autofit/afmodule.c (af_autofitter_load_glyph): Call dumping
-       functions only if we actually do tracing.
+2017-02-20  Werner Lemberg  <wl@gnu.org>
 
-2016-09-22  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       [cff] Introduce `random-seed' property (2/2).
 
-       [smooth] Reduce divisions in the line renderer.
+       * src/base/ftobjs.c: Include `FT_CFF_DRIVER_H'.
+       (open_face): Initialize `face->internal->random_seed'.
+       (FT_Face_Properties): Handle `FT_PARAM_TAG_RANDOM_SEED'.
 
-       We don't need some divisions if a line segments stays within a single
-       row or a single column of pixels.
+       * src/cff/cffdrivr.c (cff_property_set): Handle `random-seed'
+       property.
 
-       * src/smooth/ftgrays.c (gray_render_line) [FT_LONG64]: Make divisions
-       conditional.
+2017-02-20  Werner Lemberg  <wl@gnu.org>
 
-2016-09-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       [cff] Introduce `random-seed' property (1/2).
 
-       * src/smooth/ftgrays.c (gray_sweep): Remove check for empty table.
+       We need this for support of the `random' operator.
 
-2016-09-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       * include/freetype/ftcffdrv.h (FT_PARAM_TAG_RANDOM_SEED): New macro.
 
-       [smooth] Another tiny speed-up.
+       * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): New
+       field `random_seed'.
 
-       * src/smooth/ftgrays.c (gray_find_cell): Merge into...
-       (gray_record_cell): ... this function.
+       * src/cff/cffobjs.h (CFF_DriverRec): New field `random_seed'.
 
-2016-09-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+2017-02-17  Werner Lemberg  <wl@gnu.org>
 
-       * src/smooth/ftgrays.c (gray_{find,set}_cell): Remove dubious code.
+       Remove clang warnings.
 
-2016-09-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       * src/autofit/aflatin.c (af_latin_sort_blue): Add missing `static'
+       keyword.
 
-       [smooth] Fix valgrind warning and reoptimize.
+       * src/base/ftmm.c (FT_Set_Var_Design_Coordinates,
+       FT_Set_MM_Blend_Coordinates, FT_Set_Var_Blend_Coordinates):
+       Initialize some variables.
 
-       The algorithm calls `gray_set_cell' at the start of each new contour
-       or when the contours cross the cell boundaries. Double-checking for
-       that is wasteful.
+2017-02-16  Nikolaus Waxweiler  <madigens@gmail.com>
+           Werner Lemberg  <wl@gnu.org>
 
-       * src/smooth/ftgrays.c (gray_set_cell): Remove check for a new cell.
-       (gray_convert_glyph): Remove initialization introduced by 44b172e88.
+       Add face property for stem darkening.
 
-2016-09-10  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/ftautoh.h (FT_PARAM_TAG_STEM_DARKENING): New
+       macro.
 
-       [sfnt] Fix previous commit.
+       * include/freetype/internal/ftobjs.h (FT_Face_InternalRec): Add
+       `no_stem_darkening' field.
 
-       Problems reported as
+       * src/autofit/afloader.c (af_loader_load_glyph),
+       src/autofit/afmodule.c (af_property_set): Updated.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=40
+       * src/base/ftobjs.c: Include FT_AUTOHINTER_H.
+       (ft_open_face_internal): Updated.
+       (FT_Face_Properties): Handle FT_PARAM_TAG_STEM_DARKENING.
 
-       We now map the strike index right before accessing the physical
-       data, not earlier.
+       * src/cff/cf2ft.c (cf2_decoder_parse_charstrings): Updated.
 
-       * src/sfnt/sfobjs.c (sfnt_load_face): Set `face->sbit_strike_map'
-       after creating the map so that...
+       * src/cff/cffdrivr.c (cff_property_set): Updated.
 
-       * src/sfnt/ttsbit.c (tt_face_load_strike_metrics): ... this function
-       can be used before and after setting up `sbit_strike_map'.
-       (tt_face_set_sbit_strike): Revert change.
-       (tt_sbit_decoder_init, tt_face_load_sbix_image): Map strike index.
+2017-02-16  Nikolaus Waxweiler  <madigens@gmail.com>
+           Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttdriver.c (tt_size_select): Revert change.
+       Add face property for LCD filter weights.
 
-2016-09-09  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/ftlcdfil.h (FT_PARAM_TAG_LCD_FILTER_WEIGHTS,
+       FT_LCD_FILTER_FIVE_TAPS): New macros.
+       (FT_LcdFiveTapFilter): New typedef.
 
-       [ftfuzzer] Minor improvements.
+       * include/freetype/ftobjs.h (FT_Face_InternalRec)
+       [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Add `lcd_weights' field.
+       (FT_Bitmap_LcdFilterFunc): Change third argument to weights array.
+       (ft_lcd_filter_fir): New prototype.
+       (FT_LibraryRec): Updated.
 
-       * src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Ignore
-       invalid strikes.
-       Use better values for call to `FT_Set_Char_Size'.
+       * src/base/ftlcdfil.c (_ft_lcd_filter_fir): Renamed to...
+       (ft_lcd_filter_fir): ... this base function.
+       Updated.
+       (_ft_lcd_filter_legacy): Updated.
+       (FT_Library_SetLcdFilterWeights, FT_Library_SetLcdFilter): Updated.
 
-2016-09-09  Werner Lemberg  <wl@gnu.org>
+       * src/base/ftobjs.c (ft_open_face_internal): Updated.
+       (FT_Face_Properties): Handle FT_PARAM_TAG_LCD_FILTER_WEIGHTS.
 
-       [sfnt] Don't provide (completely) broken strike data.
+       * src/smooth/ftsmooth.c (ft_smooth_render_generic)
+       [FT_CONFIG_OPTION_SUBPIXEL_RENDERING]: Handle LCD weights from
+       `FT_Face_Internal'.
 
-       FreeType tries to sanitize strike header data; we now reject
-       completely broken ones.
+2017-02-14  Nikolaus Waxweiler  <madigens@gmail.com>
+           Werner Lemberg  <wl@gnu.org>
 
-       * include/freetype/internal/tttypes.h (TT_FaceRec): New
-       `sbit_strike_map' array pointer.
+       Add new function `FT_Face_Properties'.
 
-       * src/base/ftobjs.c (FT_Match_Size): Reject matches where either
-       width or height would be zero.
-       Add tracing message in case of error.
+       This commit provides the framework, to be filled with something
+       useful in the next commits.
 
-       * src/sfnt/sfobjs.c (sfnt_load_face): Populate `sbit_strike_map',
-       only using (more or less) valid strike header data for
-       FT_Face's `available_sizes' array.
-       (sfnt_done_face): Updated.
+       * include/freetype/freetype.h (FT_Face_Properties): Declare.
 
-       * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Use
-       `sbit_strike_map'.
-       (tt_face_load_strike_metrics): Improve tracing.
+       * src/base/ftobjs.c (FT_Face_Properties): New function.
 
-       * src/truetype/ttdriver.c (tt_size_select): Use `sbit_strike_map'.
+2017-02-13  Werner Lemberg  <wl@gnu.org>
 
-2016-09-08  Werner Lemberg  <wl@gnu.org>
+       [autofit] Prevent overlapping blue zones.
 
-       * Version 2.7 released.
-       =======================
+       Problem reported as
 
+         https://github.com/google/fonts/issues/632
 
-       Tag sources with `VER-2-7'.
+       The font in question (Nunito) has values 705 and 713 for the
+       reference and overshoot values, respectively, of the first blue
+       zone.  Blue zone 2, however, has value 710 for both the reference
+       and overshoot.  At 12ppem, reference and overshoot of blue zone 0
+       becomes 8px, while blue zone 2 becomes 9px.
 
-       * docs/VERSION.TXT: Add entry for version 2.7.
+       A peculiarity of this font is that the tops of isolated vertical
+       stems like `N' have a slight overshoot also.  The auto-hinter tries
+       to find the nearest blue zone using the *original* coordinates.  For
+       vertical stems, this is value 713.  For normal horizontal tops like
+       in character `E', this is value 710.  Since value 713 is mapped to
+       8px but value 710 to 9px, `N' and similar characters are one pixel
+       higher than `E', which looks very bad.
 
-       * README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
-       builds/windows/vc2005/index.html,
-       builds/windows/vc2008/freetype.vcproj,
-       builds/windows/vc2008/index.html,
-       builds/windows/vc2010/freetype.vcxproj,
-       builds/windows/vc2010/index.html,
-       builds/windows/visualc/freetype.dsp,
-       builds/windows/visualc/freetype.vcproj,
-       builds/windows/visualc/index.html,
-       builds/windows/visualce/freetype.dsp,
-       builds/windows/visualce/freetype.vcproj,
-       builds/windows/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.6.5/2.7/, s/265/27/.
+       This commit sanitizes blue zones to avoid such a behaviour.
 
-       * include/freetype/freetype.h (FREETYPE_MINOR): Set to 7.
-       (FREETYPE_PATCH): Set to 0.
+       * src/autofit/aflatin.c (af_latin_sort_blue): New function.
+       (af_latin_metrics_init_blues): Sort blue values and remove overlaps.
 
-       * builds/unix/configure.raw (version_info): Set to 18:6:12.
-       * CMakeLists.txt (VERSION_MINOR): Set to 7.
-       (VERSION_PATCH): Set to 0.
+2017-02-12  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * docs/CHANGES: Updated.
+       * src/smooth/ftgrays.c (gray_sweep): Improve code.
 
-2016-09-08  Werner Lemberg  <wl@gnu.org>
+2017-02-06  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttinterp.c: Include `ttgxvar.h'.
+       [truetype] Implement `VVAR' table support.
 
-       This fixes the `multi' build.
+       * src/truetype/ttgxvar.h (GX_HVarTable): Renamed to...
+       (GX_HVVarTable): ...This.
+       (GX_Blend): Add fields for `VVAR' table handling.
+       Other minor updates.
 
-2016-09-08  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttgxvar.c (ft_var_load_hvar): Renamed to...
+       (ft_var_load_hvvar): ...This.
+       Handle VVAR loading also (controlled by an additional parameter).
+       (tt_hadvance_adjust): Renamed to...
+       (tt_hvadvance_adjust): ...This.
+       Handle application of advance height also (controlled by an
+       additional parameter).
+       (tt_hadvance_adjust, tt_vadvance_adjust): Wrappers for
+       `tt_hvadvance_adjust'.
 
-       [autofit] Another improvement to Armenian support.
+       * src/truetype/ttdriver.c (tt_service_metrics_variations): Updated.
 
-       Suggested by Hrant H Papazian <hpapazian@gmail.com>.
+2017-02-05  Werner Lemberg  <wl@gnu.org>
 
-       * src/autofit/afscript.h: Use better suited characters to derive
-       default stem widths.
+       [autofit] Use better blue zone characters for lowercase latin.
 
-2016-09-07  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       The number of lowercase characters for computing the top flat blue
+       zone value was too small (in most cases only `x' and `z').  If one
+       of the two characters has a large serif, say, it can happen that
+       FreeType must select between two different values, having a 50%
+       chance to use the wrong one.  As a result, rendering at larger PPEM
+       values could yield uneven lowercase glyph heights.
 
-       * src/smooth/ftgrays.c (gray_hline): Micro-optimize.
+       Problem reported by Christoph Koeberlin <christoph@koe.berlin>.
 
-2016-09-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       * src/autofit/afblue.dat (AF_BLUE_STRING_LATIN_SMALL): Replaced
+       with...
+       (AF_BLUE_STRING_LATIN_SMALL_TOP, AF_BLUE_STRING_LATIN_SMALL_BOTTOM):
+       ... New, extended sets.
+       (AF_BLUE_STRINGSET_LATN): Updated.
 
-       [smooth] Operate in absolute bitmap coordinates.
+       * src/autofit/afblue.c, scr/autofit/afblue.h: Regenerated.
 
-       Simpler bitmap addressing improves performance by 1.5%.
+2017-02-04  Werner Lemberg  <wl@gnu.org>
 
-       * src/smooth/ftgrays.c (gray_TWorker): Remove count fields.
-       (gray_dump_cells, gray_find_cell, gray_set_cell, gray_hline,
-       gray_sweep, gray_convert_glyph, gray_raster_render): Updated.
+       Make `freetype-config' a wrapper of `pkg-config' if possible.
 
-2016-09-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       Based on ideas taken from
 
-       [smooth] Improve contour start (take 2).
+         http://pkgs.fedoraproject.org/cgit/rpms/freetype.git/tree/freetype-multilib.patch
+         http://pkgs.fedoraproject.org/cgit/rpms/freetype.git/tree/freetype-2.5.3-freetype-config-prefix.patch
 
-       * src/smooth/ftgrays.c (gray_move_to): Call `gray_set_cell' directly
-       instead of...
-       (gray_start_cell): ... this function, which is removed.
-       (gray_convert_glyph): Make initial y-coordinate invalid.
+       * builds/unix/freetype-config.in: Rewritten.  Use `pkg-config' to
+       set output variables if program is available.
 
-2016-09-06  Werner Lemberg  <wl@gnu.org>
+       * docs/CHANGES, docs/freetype-config.1: Updated.
 
-       [type1] MM fonts support exactly zero named instances (#48748).
+2017-02-04  Werner Lemberg  <wl@gnu.org>
 
-       * src/type1/t1load.c (T1_Get_MM_Var): Set `num_namedstyles' to zero.
+       * builds/unix/unix-def.in (freetype-config): Fix permissions.
 
-2016-09-06  Jonathan Kew  <jfkthame@gmail.com>
+2017-02-03  Werner Lemberg  <wl@gnu.org>
 
-       [cff] Fix uninitialized memory.
+       * src/autofit/afglobal.c (af_face_globals_free): Erase useless code.
 
-       Problem reported as
+2017-02-03  Werner Lemberg  <wl@gnu.org>
 
-         https://bugzilla.mozilla.org/show_bug.cgi?id=1270288
+       * include/freetype/ftgasp.h (FT_GASP_SYMMETRIC_GRIDFIT): Fix value.
 
-       * src/cff/cf2interp.c (cf2_interpT2CharString): Initialize `storage'
-       array to handle a `get' opcode without a previous `put'.
+       Reported by Behdad.
 
-2016-09-05  Alexei Podtelezhnikov  <apodtele@gmail.com>
+2017-02-02  Werner Lemberg  <wl@gnu.org>
 
-       * src/smooth/ftgrays.c (gray_move_to, gray_start_cell): Revert.
+       [truetype] Fix MVAR post-action handling.
 
-2016-09-05  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       Reported as
 
-       [smooth] Improve contour start.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=509
 
-       * src/smooth/ftgrays.c (gray_move_to): Call `gray_set_cell' directly
-       instead of...
-       (gray_start_cell): ... this function, which is removed.
+       * src/truetype/ttobjs.c (tt_size_reset): Do nothing for CFF2.  This
+       is important to make `tt_size_reset_iterator' (called in
+       `tt_apply_mvar') always work.
 
-2016-09-05  Werner Lemberg  <wl@gnu.org>
+2017-02-02  Werner Lemberg  <wl@gnu.org>
 
-       [cff] Fix memory initialization.
+       Make compilation with FT_CONFIG_OPTION_PIC work again.
 
-       * src/cff/cf2stack.c (cf2_stack_init): Use `FT_NEW'.  The `Q'
-       variants of FreeType's memory allocation macros don't do zeroing.
+       All code committed here is guarded with `FT_CONFIG_OPTION_PIC'.
 
-2016-09-05  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/internal/services/svmetric.h
+       (FT_DEFINE_SERVICE_METRICSVARIATIONSREC): Remove trailing semicolon.
 
-       [ftrandom] Minor improvements.
+       * src/autofit/aflatin.c (af_latin_hints_compute_edges,
+       af_latin_hint_edges): Provide `globals' variable.
 
-       * src/tools/ftrandom/ftrandom.c (_XOPEN_SOURCE): New macro, set to
-       500.
+       * src/autofit/afloader.c (af_loader_load_glyph): Remove shadowing
+       variable.
 
-       * src/tools/ftrandom/Makefile (CFLAGS): Split off include
-       directories to ...
-       (INCLUDES): ... this new variable.
-       (LDFLAGS): New variable.
-       (ftrandom.o, ftrandom): Updated.
+       * src/autofit/afmodule.c (AF_SCRIPT_CLASSES_GET,
+       AF_STYLE_CLASSES_GET): Redefine.
 
-2016-09-05  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/aftypes.h (AF_DEFINE_WRITING_SYSTEM_CLASS): Fix typo.
 
-       [autofit] Improve Armenian support.
+       * src/cff/cffparse.c (CFF_FIELD_BLEND): Provide it.
 
-       Thanks to Hrant H Papazian <hpapazian@gmail.com> for help.
+       * src/cff/cffpic.h (CffModulePIC): Fix typo.
 
-       * src/autofit/afblue.dat (AF_BLUE_STRING_ARMENIAN_*): Improve
-       selection of characters.
+2017-01-31  Alexei Podtelezhnikov  <apodtele@gmail.com>
 
-       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+       * src/smooth/ftgrays.c (gray_render_scanline): Improve code.
 
-2016-09-04  Werner Lemberg  <wl@gnu.org>
+2017-01-31  Werner Lemberg  <wl@gnu.org>
 
-       [ftrandom] Improve Makefile.
+       [cff] Provide metrics variation service interface (#50196).
 
-       It now supports both a normal build (`./configure && make') and a
-       development build (`make devel').
+       Only now I've got an OTF with an HVAR table for testing...
 
-       * src/tools/ftrandom/Makefile (VPATH): Set it so that
-       `libfreetype.a' gets searched in both `objs' (for the development
-       build) and `objs/.libs' (for a normal build which uses libtool).
-       (LIBS): Add missing libraries.
-       (ftrandom.o): New rule.
-       (ftrandom): Use automatic variables.
+       The code in `ftmm.c' uses `FT_FACE_LOOKUP_SERVICE' to get the
+       metrics variations interface.  However, this didn't work with
+       `FT_FACE_FIND_GLOBAL_SERVICE' used in `sfnt_init_face'.
 
-2016-09-03  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cffdrivr.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
+       (cff_hadvance_adjust, cff_metrics_adjust): Wrapper functions for
+       metric service functions from the `truetype' module.
+       (cff_service_metrics_variations): New service.
+       (cff_services): Updated.
 
-       [truetype] More fixes for handling of GX deltas.
+       * src/cff/cffpic.h (CFF_SERVICE_METRICS_VAR_GET): New macro.
+       [FT_CONFIG_OPTION_PIC]: Synchronize code.
 
-       Problems reported by Bob Taylor <Bob.Taylor@monotype.com>.
+       * src/sfnt/sfobjs.c (sfnt_init_face): Replace call to
+       FT_FACE_FIND_GLOBAL_SERVICE with `ft_module_get_service' to always
+       load the service from the `truetype' module.
 
-       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Fix rough
-       sanity test for glyph variation array header size.
-       Always set stream position before reading packed x and y deltas.
-       Fix thinko w.r.t. `localpoints' array.
+2017-01-31  Werner Lemberg  <wl@gnu.org>
 
-2016-09-03  Werner Lemberg  <wl@gnu.org>
+       Add framework to support services with 9 functions.
 
-       [ftrandom] Various fixes.
+       * include/freetype/internal/ftserv.h (FT_DEFINE_SERVICEDESCREC9):
+       New macro.
 
-       * src/tools/ftrandom/ftrandom.c (GOOD_FONTS_DIR): Provide better
-       default.
-       (error_fraction): Make it of type `double' to work as advertized –
-       this was completely broken.
-       Update all related code.
-       (error_count, fcnt): Make it unsigned to fix compiler warnings.
-       Update all related code.
-       (fontlist): Change `len' member to `long' to fix compiler warnings.
-       (FT_MoveTo, FT_LineTo, FT_ConicTo, FT_CubicTo, abort_test): Tag
-       unused variables.
-       (TestFace, FindFonts, copyfont, do_test): Fix compiler warnings.
-       (ExecuteTest): Ditto.
-       Call `FT_Done_FreeType'.
-       (getErrorCnt): Replace `ceil' with an ordinary cast to `unsigned
-       int'.
-       (usage): Improve output.
-       (main): Fix compiler warnings.
+2017-01-31  Werner Lemberg  <wl@gnu.org>
 
-       * src/tools/ftrandom/README: Updated.
+       [base] Fix error handing in MM functions.
 
-2016-09-03  Werner Lemberg  <wl@gnu.org>
+       * src/base/ftmm.c (FT_Set_Var_Design_Coordinates,
+       FT_Set_MM_Blend_Coordinates, FT_Set_Var_Blend_Coordinates):
+       Implement it.
 
-       [base] Avoid negative bitmap strike dimensions (#48985).
+2017-01-31  Werner Lemberg  <wl@gnu.org>
 
-       * src/base/ftobjs.c (FT_Open_Face): Check whether negation was
-       actually successful.  For example, this can fail for value
-       -32768 if the type is `signed short'.  If there are problems,
-       disable the strike.
+       [truetype] Fix sanity check for `gvar' table (#50184).
 
-2016-09-03  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttgxvar.c (ft_var_load_gvar): There might be missing
+       variation data for some glyphs.
 
-       [cff] Avoid null pointer passed to FT_MEM_COPY (#48984).
+2017-01-31  Werner Lemberg  <wl@gnu.org>
 
-       * src/cff/cffload.c (cff_index_get_name): Check `byte_len'.
+       [autofit] Avoid uninitialized jumps (#50191).
 
-2016-09-02  Werner Lemberg  <wl@gnu.org>
+       * src/autofit/afcjk.c (af_cjk_metrics_check_digits),
+       src/autofit/aflatin.c (af_latin_metrics_check_digits): Initialize
+       `advance'.
 
-       [unix] Enable 64bit support in file system access (#48962).
+2017-01-27  Werner Lemberg  <wl@gnu.org>
 
-       * builds/unix/configure.raw: Call `AC_SYS_LARGEFILE'.
+       s/GB2312/PRC/.
 
-2016-09-02  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/freetype.h (FT_ENCODING_PRC): New enum value.
+       (FT_ENCODING_GB2312): Deprecated.
 
-       [sfnt] Avoid left shift of negative value (#48980).
+       * include/freetype/ttnameid.h (TT_MS_ID_PRC): New macro.
+       (TT_MS_ID_GB2312): Deprecated.
 
-       * src/sfnt/ttsbit.c (tt_sbit_decoder_load_bit_aligned): Use unsigned
-       constant.
+       * src/sfnt/sfobjs.c (sfnt_find_encoding): Updated.
 
-2016-09-02  Werner Lemberg  <wl@gnu.org>
+       * docs/CHANGES: Updated.
 
-       * src/smooth/ftgrays.c (gray_hline): Fix clang compiler warnings.
+2017-01-26  Werner Lemberg  <wl@gnu.org>
 
-2016-09-02  Werner Lemberg  <wl@gnu.org>
+       [base] Add `FT_Get_Sfnt_LangTag' function.
 
-       Some preparations for the next release.
+       * include/freetype/ftsnames.h (FT_SfntLangTag): New structure.
+       (FT_Get_Sfnt_LangTag): New declaration.
 
-       * include/freetype/config/ftoption.h
-       (TT_CONFIG_OPTION_SUBPIXEL_HINTING): Enable.
+       * src/base/ftsnames.c (FT_Get_Sfnt_LangTag): New function.
 
        * docs/CHANGES: Updated.
 
-2016-09-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+2017-01-26  Werner Lemberg  <wl@gnu.org>
 
-       [smooth] Simplify span rendering more.
+       [sfnt] Support `name' table format 1.
 
-       It turns out that there is significant cost associated with `FT_Span'
-       creation and calls to `gray_render_span' because it happens so
-       frequently. This removes these steps from our internal use but leaves
-       it alone for `FT_RASTER_FLAG_DIRECT" to preserve API. The speed gain
-       is about 5%.
+       * include/freetype/internal/tttypes.h (TT_LangTagRec): New
+       structure.
+       (TT_NameTableRec): Add fields `numLangTagRecords' and `langTags'.
 
-       * src/smooth/ftgrays.c (gray_render_span): Removed. The code is
-       migrated to...
-       (gray_hline): ... here.
+       * src/sfnt/ttload.c (tt_face_load_name): Add support for language
+       tags.
+       Reduce array size of name strings in case of invalid entries.
+       (tt_face_free_name): Updated.
 
-2016-08-30  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       * docs/CHANGES: Updated.
 
-       [smooth] Streamline pixmap drawing a bit more.
+2017-01-25  Werner Lemberg  <wl@gnu.org>
 
-       Zero coverage is unlikely (1 out of 256) to warrant checking. This
-       gives 0.5% speed improvement in rendering simple glyphs.
+       [sfnt] s/TT_NameEntry/TT_Name/.
 
-       * src/smooth/ftgrays.c (gray_hline, gray_render_span): Remove checks.
+       * include/freetype/internal/tttypes.h (TT_NameEntryRec): Renamed
+       to...
+       (TT_NameRec): This.
+       (TT_NameTableRec): Updated.
 
-2016-08-29  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       * src/base/ftsnames.c (FT_Get_Sfnt_Name): Updated.
 
-       [smooth] Streamline pixmap drawing.
+       * src/sfnt/sfdriver.c (sfnt_get_ps_name): Updated.
 
-       This gives 2% speed improvement in rendering simple glyphs.
+       * src/sfnt/sfobjs.c (tt_name_entry_ascii_from_utf16,
+       tt_name_entry_ascii_from_other): Renamed to...
+       (tt_name_ascii_from_utf16, tt_name_entry_ascii_from_other): This,
+       respectively.
+       (TT_NameEntry_ConvertFunc): Renamed to...
+       (TT_Name_ConvertFunc): This.
+       (tt_face_get_name): Updated.
 
-       * src/smooth/ftgrays.c (TPixmap): Reduced pixmap descriptor with a
-       pointer to its bottom-left and pitch to be used in...
-       (gray_TWorker): ... here.
-       (gray_render_span): Move pixmap flow check from here...
-       (gray_raster_render): .. to here.
+       * src/sfnt/ttload.c (tt_face_load_name, tt_face_free_name):
+       Updated.
 
-2016-08-27  Alexei Podtelezhnikov  <apodtele@gmail.com>
+2017-01-24  Werner Lemberg  <wl@gnu.org>
 
-       [smooth] Reduce stack of band boundaries.
+       [sfnt] Fix Postscript name service for symbol fonts.
 
-       * src/smooth/ftgrays.c (gray_TBand): Removed.
-       (gray_convert_glyph): Updated to stack band boundaries concisely.
+       * src/sfnt/sfdriver.c (sfnt_get_ps_name): Accept PID/EID=3/0
+       entries also.
 
-2016-08-26  Werner Lemberg  <wl@gnu.org>
+2017-01-24  Werner Lemberg  <wl@gnu.org>
 
-       * src/cid/cidload.c (cid_face_open): Improve handling of `SDBytes'.
+       [truetype] For OpenType 1.7: s/preferred/typographic/ (sub)family.
 
-2016-08-26  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/ftsnames.h
+       (FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY,
+       FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY): New macros.
+       (FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY,
+       FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY): Deprecated.
 
-       [cid] Fix commit from 2016-05-16.
+       * include/freetype/ttnameid.h (TT_NAME_ID_TYPOGRAPHIC_FAMILY,
+       TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY): New macros.
+       (TT_NAME_ID_PREFERRED_FAMILY, TT_NAME_ID_PREFERRED_SUBFAMILY):
+       Deprecated.
 
-       * src/cid/cidparse.c (cid_parser_new): Fix off-by-one errors.
+       * src/sfnt/sfobjs.c (sfnt_load_face): Updated.
 
-2016-08-26  Werner Lemberg  <wl@gnu.org>
+       * docs/CHANGES: Updated.
 
-       [sfnt] Cache offset and size to bitmap data table.
+2017-01-23  Werner Lemberg  <wl@gnu.org>
 
-       This commit avoids `EBDT' and friends being looked up again and
-       again while loading a single embedded bitmap.
+       [base] Add `FT_Set_Default_Properties' (#49187).
 
-       * include/freetype/internal/tttypes.h (TT_FaceRec)
-       [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: New fields `ebdt_start' and
-       `ebdt_size'.
+       * include/freetype/ftmodapi.h: Add declaration.
 
-       * src/sfnt/ttsbit.c (tt_sbit_decoder_init): Move table lookup to ...
-       (tt_face_load_sbit): ... this function; also store the table size
-       and offset.
+       * src/base/ftinit.c (ft_set_default_properties): Renamed to...
+       (FT_Set_Default_Properties): ... this.
+       (FT_Init_FreeType): Updated.
 
-2016-08-26  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       * docs/CHANGES: Updated.
 
-       * src/smooth/ftgrays.c (gray_raster_render): Minor tweaks.
+2017-01-23  Werner Lemberg  <wl@gnu.org>
 
-2016-08-26  Werner Lemberg  <wl@gnu.org>
+       [truetype] Minor updates for OpenType 1.8.1.
 
-       [type1] Fix heap buffer overflow.
+       * src/truetype/ttgxvar.h (GX_MVarTable): `axisCount' has been
+       removed from the specification; it is now reserved.
 
-       Reported as
+       * src/truetype/ttgxvar.c (ft_var_load_mvar): Updated.
+       (GX_FVar_Head): Remove `countSizePairs'; the corresponding data
+       field in the `MVAR' table is now reserved.
+       (fvar_fields): Updated.
 
-         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=36
+2017-01-23  Werner Lemberg  <wl@gnu.org>
 
-       * src/type1/t1load.c (parse_charstrings): Reject fonts that don't
-       contain glyph names.
+       [truetype] Avoid segfault for invalid variation data.
 
-2016-08-25  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttgxvar.c (ft_var_load_item_variation_store): Assure
+       `itemCount' is not zero.
 
-       [sfnt] Fix previous commit (#48901).
+       Reported as
 
-       * src/sfnt/ttcmap.c (tt_cmap4_char_map_binary): Thinkos.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=441
 
-2016-08-25  Werner Lemberg  <wl@gnu.org>
+2017-01-20  Werner Lemberg  <wl@gnu.org>
 
-       [sfnt] Speed up handling of invalid format 4 cmaps.
+       * src/truetype/ttinterp.c (TT_RunIns): Adjust loop detector limits.
 
-       * src/sfnt/ttcmap.c (tt_cmap4_next, tt_cmap4_char_map_binary): Add
-       tests for `num_glyph' from `tt_cmap4_char_map_linear'.
+2017-01-17  Werner Lemberg  <wl@gnu.org>
 
-2016-08-25  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/ttnameid.h: Updated to OpenType 1.8.1.
 
-       * include/freetype/internal/ftdriver.h: Remove unused typedefs.
+       (TT_APPLE_ID_FULL_UNICODE): New macro.
 
-2016-08-22  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       (TT_MS_LANGID_BOSNIAN_BOSNIA_HERZ_CYRILLIC,
+       TT_MS_LANGID_UPPER_SORBIAN_GERMANY,
+       TT_MS_LANGID_LOWER_SORBIAN_GERMANY, TT_MS_LANGID_IRISH_IRELAND,
+       TT_MS_LANGID_INUKTITUT_CANADA_LATIN, TT_MS_LANGID_BASHKIR_RUSSIA,
+       TT_MS_LANGID_LUXEMBOURGISH_LUXEMBOURG,
+       TT_MS_LANGID_GREENLANDIC_GREENLAND, TT_MS_LANGID_MAPUDUNGUN_CHILE,
+       TT_MS_LANGID_MOHAWK_MOHAWK, TT_MS_LANGID_BRETON_FRANCE,
+       TT_MS_LANGID_OCCITAN_FRANCE, TT_MS_LANGID_CORSICAN_FRANCE,
+       TT_MS_LANGID_ALSATIAN_FRANCE, TT_MS_LANGID_YAKUT_RUSSIA,
+       TT_MS_LANGID_KICHE_GUATEMALA, TT_MS_LANGID_KINYARWANDA_RWANDA,
+       TT_MS_LANGID_WOLOF_SENEGAL, TT_MS_LANGID_DARI_AFGHANISTAN): New
+       macros.
 
-       [smooth] Simplify span rendering.
+       (TT_MS_LANGID_SERBIAN_BOSNIA_HERZ_CYRILLIC): Fix value.
 
-       This removes unnecessary complexity of span merging and buffering.
-       Instead, the spans are rendered as they come, speeding up the
-       rendering by about 5% as a result.
+       (TT_MS_LANGID_GERMAN_LIECHTENSTEIN, TT_MS_LANGID_CATALAN_CATALAN,
+       TT_MS_LANGID_CHINESE_MACAO, TT_MS_LANGID_SPANISH_SPAIN_MODERN_SORT,
+       TT_MS_LANGID_KOREAN_KOREA, TT_MS_LANGID_ROMANSH_SWITZERLAND,
+       TT_MS_LANGID_SLOVENIAN_SLOVENIA, TT_MS_LANGID_BASQUE_BASQUE,
+       TT_MS_LANGID_SETSWANA_SOUTH_AFRICA,
+       TT_MS_LANGID_ISIXHOSA_SOUTH_AFRICA,
+       TT_MS_LANGID_ISIZULU_SOUTH_AFRICA, TT_MS_LANGID_KAZAKH_KAZAKHSTAN,
+       TT_MS_LANGID_KYRGYZ_KYRGYZSTAN, TT_MS_LANGID_KISWAHILI_KENYA,
+       TT_MS_LANGID_TATAR_RUSSIA, TT_MS_LANGID_ODIA_INDIA,
+       TT_MS_LANGID_MONGOLIAN_PRC, TT_MS_LANGID_TIBETAN_PRC,
+       TT_MS_LANGID_WELSH_UNITED_KINGDOM, TT_MS_LANGID_GALICIAN_GALICIAN,
+       TT_MS_LANGID_SINHALA_SRI_LANKA, TT_MS_LANGID_TAMAZIGHT_ALGERIA,
+       TT_MS_LANGID_SESOTHO_SA_LEBOA_SOUTH_AFRICA, TT_MS_LANGID_YI_PRC,
+       TT_MS_LANGID_UIGHUR_PRC): New aliases.
 
-       * src/smooth/ftgrays.c [FT_MAX_GRAY_SPANS]: Macro removed.
-       (gray_TWorker): Remove span buffer and related fields.
-       (gray_sweep, gray_hline): Updated.
+       Remove commented out code.
 
-       * include/freetype/ftimage.h: Remove documentation note about
-       `FT_MAX_GRAY_SPANS', which was never in `ftoption.h' and is now gone.
+       (TT_NAME_ID_LIGHT_BACKGROUND, TT_NAME_ID_DARK_BACKGROUND,
+       TT_NAME_ID_VARIATIONS_PREFIX): New macros.
 
-2016-08-16  Werner Lemberg  <wl@gnu.org>
+       (HAVE_LIMIT_ON_IDENTS): Remove macro (which was useless since many
+       years), use guarded long macros by default and define short versions
+       as aliases for the long ones.
 
-       [truetype] Fix `MPS' instruction.
+2017-01-15  Werner Lemberg  <wl@gnu.org>
 
-       According to Greg Hitchcock, MPS in DWrite really returns the point
-       size.
+       * src/truetype/ttgxvar.c (tt_apply_var): Handle underline parameters
+       also.
 
-       * src/truetype/ttobjs.h (TT_SizeRec): Add `point_size' member.
+2017-01-11  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttdriver.c (tt_size_request): Set `point_size'.
+       * src/base/ftobjs.c (ft_open_face_internal): Improve tracing.
 
-       * src/truetype/ttinterp.h (TT_ExecContextRec): Add `pointSize'
-       member.
+2017-01-11  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttinterp.c (TT_Load_Context): Updated.
-       (Ins_MPS): Fix instruction.
+       [truetype] Actually use metrics variation service.
 
-2016-08-16  Werner Lemberg  <wl@gnu.org>
+       * src/base/ftmm.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
+       (ft_face_get_mvar_service): New auxiliary function to look up
+       metrics variation service.
+       (FT_Set_Var_Design_Coordinates, FT_Set_MM_Blend_Coordinates,
+       FT_Set_Var_Blend_Coordinates): Call metrics variation service.
 
-       [lzw] Optimize last commit.
+       * src/truetype/ttobjs.c (tt_face_init): Use metrics variations for
+       named instances.
 
-       * src/lzw/ftzopen.c (ft_lzwstate_get_code): Move check into
-       conditional clause.
+2017-01-11  Werner Lemberg  <wl@gnu.org>
 
-2016-08-16  Werner Lemberg  <wl@gnu.org>
+       [truetype] Provide metrics variation service.
 
-       [lzw] Avoid invalid left shift.
+       * include/freetype/internal/services/svmetric.h
+       (FT_Metrics_Adjust_Func): Reduce number of necessary parameters.
 
-       Reported as
+       * src/truetype/ttgxvar.c: Include FT_LIST_H.
+       (tt_size_reset_iterator): New auxiliary function for...
+       (tt_apply_var): New function.
 
-         https://bugzilla.mozilla.org/show_bug.cgi?id=1295366
+       * src/truetype/ttgxvar.h: Updated.
 
-       * src/lzw/ftzopen.c (ft_lzwstate_get_code): Limit `num_bits'.
+       * src/truetype/ttdriver.c (tt_service_metrics_variations): Add
+       `tt_apply_mvar'.
 
-2016-08-16  Werner Lemberg  <wl@gnu.org>
+       * include/freetype/internal/ftserv.h (FT_ServiceCache): Add metrics
+       variation service.
 
-       [lzw] Avoid buffer overrun.
+2017-01-11  Werner Lemberg  <wl@gnu.org>
 
-       Reported as
+       [truetype] Parse `MVAR' table.
 
-         https://bugzilla.mozilla.org/show_bug.cgi?id=1273283
+       * src/truetype/ttgxvar.h (MVAR_TAG_XXX): New macros for MVAR tags.
+       (GX_Value, GX_MVarTable): New structures.
+       (GX_Blend): Add it.
 
-       * src/lzw/ftzopen.c (ft_lzwstate_refill): Ensure `buf_size' doesn't
-       underflow.
+       * src/truetype/ttgxvar.c (GX_VALUE_SIZE, GX_VALUE_CASE,
+       GX_GASP_CASE): New macros.
+       (ft_var_get_value_pointer): New auxiliary function to get a pointer
+       to a value from various SFNT tables already stored in `TT_Face'.
+       (ft_var_load_mvar): New function.
+       (TT_Get_MM_Var): Call it.
+       (tt_done_blend): Updated.
 
-2016-08-16  Werner Lemberg  <wl@gnu.org>
+2017-01-11  Werner Lemberg  <wl@gnu.org>
 
-       [truetype] Fix compiler warning.
+       [truetype] More preparations for MVAR support.
 
-       * src/truetype/ttgload.c (load_truetype_glyph): Add cast.
+       * src/truetype/ttobjs.c (tt_size_reset): Add argument to make
+       function only recompute ascender, descender, and height.
 
-2016-08-13  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttobjs.h: Updated.
 
-       [winfonts] Avoid zero bitmap width and height.
+       * src/truetype/ttdriver.c (tt_size_select, tt_size_request):
+       Updated.
 
-       Reported as
+2017-01-09  Werner Lemberg  <wl@gnu.org>
 
-         https://bugzilla.mozilla.org/show_bug.cgi?id=1272173
+       [pcf] Disable long family names by default.
 
-       * src/winfonts/winfnt.c (FNT_Face_Init): Check zero pixel height.
-       (FNT_Load_Glyph): Check for zero pitch.
+       * include/freetype/config/ftoption.h
+       (PCF_CONFIG_OPTION_LONG_FAMILY_NAMES): Comment out.
 
-2016-08-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+2017-01-09  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttinterp.c (Pop_Push_Count): Revert changes.
+       [pcf] Make long family names configurable.
 
-2016-08-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       The change from 2016-09-29 was too radical (except for people using
+       the openSuSE GNU/Linux distribution).  To ameliorate the situation,
+       PCF_CONFIG_OPTION_LONG_FAMILY_NAMES gets introduced which controls
+       the feature; if set, a new PCF property option
+       `no-long-family-names' can be used to switch this feature off.
 
-       * src/truetype/ttinterp.c (TT_RunIns): Minor and formatting.
+       * include/freetype/config/ftoption.h, devel/ftoption.h
+       (PCF_CONFIG_OPTION_LONG_FAMILY_NAMES): New option.
 
-2016-08-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       * include/freetype/ftpcfdrv.h: New header file (only containing
+       comments currently, used for building the documentation).
 
-       * src/truetype/ttinterp.c (Pop_Push_Count): Fix some entries.
+       * include/freetype/config/ftheader.h (FT_PCF_DRIVER_H): New macro.
 
-2016-08-10  Peter Klotz  <Peter.Klotz@ith-icoserve.com>
+       * src/pcf/pcf.h (PCF_Driver): Add `no_long_family_names' field.
 
-       * src/smooth/ftgrays.c (gray_hline): Fix uninitialized access.
+       * src/pcf/pcfdrivr.c: Include FT_SERVICE_PROPERTIES_H and
+       FT_PCF_DRIVER_H.
+       (pcf_property_set, pcf_property_get): New functions.
+       (pcf_service_properties): New service.
+       (pcf_services): Updated.
+       (pcf_driver_init) [PCF_CONFIG_OPTION_LONG_FAMILY_NAMES]: Handle
+       `no_long_family_names'.
 
-2016-08-10  Werner Lemberg  <wl@gnu.org>
+       * src/pcf/pcfread.c (pcf_load_font): Handle `no_long_family_names'
+       and PCF_CONFIG_OPTION_LONG_FAMILY_NAMES.
 
-       [sfnt] Use correct type for `italicAngle' field (#48732).
+       * docs/CHANGES: Updated.
 
-       * src/sfnt/ttload.c (tt_face_load_post): Fix types.
+2017-01-09  Werner Lemberg  <wl@gnu.org>
 
-2016-08-06  Jon Spencer  <jon@jonspencer.ca>
+       [pcf] Introduce a driver structure.
 
-       [sfnt] Fix `FT_Get_Advance' for bitmap strikes.
+       To be filled later on with something useful.
 
-       `FT_Get_Advance' returns 0 for bitmap fonts.  It first gets the
-       advance value from the font table and then scales it by the
-       `font->size->metrics->x_scale' field.  But `FT_Select_Size' doesn't
-       set that value for bitmap fonts and the advance gets scaled to zero.
+       * src/pcf/pcf.h (PCF_Driver): New structure.
 
-       Taken from
+       * src/pcf/pcfdrivr.c (pcf_driver_init, pcf_driver_done): New dummy
+       functions.
+       (pcf_driver_class): Updated.
 
-         https://github.com/behdad/harfbuzz/issues/252
+2017-01-08  Werner Lemberg  <wl@gnu.org>
 
-       * src/sfnt/ttsbit.c (tt_face_load_strike_metrics)
-       <TT_SBIT_TABLE_TYPE_EBLC>: Set scale values.
+       [truetype] Again some GX code shuffling.
 
-2016-08-06  Behdad Esfahbod  <behdad@behdad.org>
+       We need this later on for MVAR also.
 
-       [truetype] Fix GX variation handling of composites.
+       * src/truetype/ttgxvar.c (tt_hadvance_adjust): Split off computing
+       an item store variation delta into...
+       (ft_var_get_item_delta): ...new function.
 
-       * src/truetype/ttgload.c (load_truetype_glyph)
-       [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Check `ARGS_ARE_XY_VALUES' flag.
+2017-01-08  Werner Lemberg  <wl@gnu.org>
 
-2016-08-05  Alexei Podtelezhnikov  <apodtele@gmail.com>
+       [truetype] Adjust font variation flags for MVAR.
 
-       [smooth] Minor refactoring.
+       * include/freetype/internal/tttypes.h (TT_FACE_FLAG_VAR_XXX):
+       Remove all flags related to MVAR; replace it with...
+       (TT_FACE_FLAG_VAR_MVAR): ...this new macro.
+       (TT_Face): Remove `mvar_support' field (which was still unused).
 
-       * src/smooth/ftgrays.c (gray_render_scanline, gray_render_line):
-       Updated.
+2017-01-06  Werner Lemberg  <wl@gnu.org>
 
-2016-07-29  Werner Lemberg  <wl@gnu.org>
+       [truetype] More GX code shuffling.
 
-       [sfnt, truetype] Don't abort on invalid `maxComponentDepth'.
+       We need this later on for MVAR also.
 
-       Since 2016-05-16 we detect infinite recursion directly.
+       * src/truetype/ttgxvar.c (tt_done_blend): Split off handling of item
+       variation store into...
+       (ft_var_done_item_variation_store): ...new function.
 
-       * src/sfnt/ttload.c (tt_face_load_maxp): Don't adjust
-       `maxComponentDepth'.
-       * src/truetype/ttgload.c (load_truetype_glyph): Don't abort if
-       `maxComponentDepth' is not valid.  Instead, simply adjust its value
-       and emit a tracing message.
+2017-01-06  Werner Lemberg  <wl@gnu.org>
 
-2016-07-26  Werner Lemberg  <wl@gnu.org>
+       [truetype] More generalization of GX stuff.
 
-       * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Minor.
+       We need this later on for MVAR also.
 
-       No functional change.
+       * src/truetype/ttgxvar.c (ft_var_load_delta_set_index_mapping): Add
+       parameters for delta-set index mapping and item variation store.
+       (ft_var_load_item_variation_store): Add parameter for item variation
+       store.
+       s/hvarData/varData/.
+       Move allocation of `hvar_table' to...
+       (ft_var_load_hvar): ...this function.
+       Updated.
 
-2016-07-22  Hin-Tak Leung  <htl10@users.sourceforge.net>
+2017-01-06  Werner Lemberg  <wl@gnu.org>
 
-       [truetype] Record the end of IDEFs.
+       [truetype] Some GX structure renames for generalization.
 
-       To match the logic in FDEF.  The value of the end is only used for
-       bound-checking in `Ins_JMPR', so it may not have been obvious that
-       it was not recorded.  Tested (as part of Font Validator 2.0) all the
-       fonts on Fedora and did not see any change.
+       We need this later on for MVAR also.
 
-       * src/truetype/ttinterp.c (Ins_IDEF): Updated.
+       * src/truetype/ttgxvar.h (GX_HVarData): Renamed to...
+       (GX_ItemVarData): ...this.
+       (GX_HVarRegion): Renamed to...
+       (GX_VarRegion): ...this.
+       (GX_HVStore): Renamed to...
+       (GX_ItemVarStore): ...this.
+       (GX_WidthMap): Renamed to...
+       (GX_DeltaSetIdxMap): ...this.
 
-2016-07-19  Werner Lemberg  <wl@gnu.org>
+       (GX_HVarTable): Updated.
 
-       [truetype] Sanitizer fix, second try.
+       * src/truetype/ttgxvar.c: Updated.
 
-       * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Fix boundary
-       tests and use only one slot more.
+2017-01-06  Werner Lemberg  <wl@gnu.org>
 
-2016-07-19  Werner Lemberg  <wl@gnu.org>
+       [truetype] Code shuffling.
 
-       [truetype] Sanitizer fix.
+       * src/truetype/ttgxvar.c (ft_var_load_hvar): Split off loading of
+       item variation store and delta set index mapping into...
+       (ft_var_load_item_variation_store,
+       ft_var_load_delta_set_index_mapping): ...new functions.
 
-       * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Increase array
-       to fix nested loops.
+2017-01-06  Werner Lemberg  <wl@gnu.org>
 
-2016-07-18  Werner Lemberg  <wl@gnu.org>
+       [truetype] Add HVAR access without advance width map.
 
-       [truetype] Make GETDATA work only for GX fonts.
+       * src/truetype/ttgxvar.c (ft_var_load_hvar): Handle case where
+       `offsetToAdvanceWidthMapping' is zero.
+       (tt_hadvance_adjust): Implement direct deltaSet access by glyph
+       index.
 
-       * src/truetype/ttinterp.c (opcode_name): Updated.
-       (Ins_GETDATA): Only define for `TT_CONFIG_OPTION_GX_VAR_SUPPORT'.
-       (TT_RunIns): Updated.
+2017-01-06  Werner Lemberg  <wl@gnu.org>
 
-2016-07-17  Werner Lemberg  <wl@gnu.org>
+       [pcf] Revise driver.
 
-       [truetype] Add support for Apple's
+       This commit improves tracing and handling of malformed fonts.  In
+       particular, the changes to `pcf_get_properties' fix
 
-         GETDATA[], opcode 0x92
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=379
 
-       bytecode instruction.  It always returns 17, and we have absolutely
-       no idea what it is good for...
+       * src/pcf/pcfread.c (tableNames): Use long names for better
+       readability.
+       (pcf_read_TOC): Allow at most 9 tables.
+       (pcf_get_properties): Allow at most 256 properties.
+       Limit strings array length to 256 * (65536 + 1) bytes.
+       Better tracing.
+       (pcf_get_metric): Trace metric data.
+       (pcf_get_metrics): Allow at most 65536 metrics.
+       Fix comparison of `metrics->ascent' and `metrics->descent' to avoid
+       potential overflow.
+       Better tracing.
+       (pcf_get_bitmaps): Allow at most 65536 bitmaps.
+       Better tracing.
+       (pcf_get_encodings, pcf_get_accel): Better tracing.
 
-       * src/truetype/ttinterp.c (Pop_Push_Count, opcode_name): Updated.
-       (Ins_GETDATA): New function.
-       (TT_RunIns): Add it.
+       * src/pcf/pcfdrivr.c (PCF_Glyph_Load): Don't trace `format' details.
+       These are now shown by `pcf_get_bitmaps'.
 
-2016-07-16  Werner Lemberg  <wl@gnu.org>
+2017-01-04  Werner Lemberg  <wl@gnu.org>
 
-       [truetype] Add bytecode support for GX variation fonts.
+       * src/pcf/pcfdrivr.c (PCF_Face_Init): Trace compression format.
 
-       This commit implements undocumented (but confirmed) stuff from
-       Apple's old bytecode engine.
+2017-01-04  Werner Lemberg  <wl@gnu.org>
 
-         GETVARIATION[], opcode 0x91
-           This opcode pushes normalized variation coordinates for all axes
-           onto the stack (in 2.14 format).  Coordinate of first axis gets
-           pushed first.
+       [cff] More consistency checks for pure CFFs.
 
-         GETINFO[], selector bit 3
-           If GX variation support is enabled, bit 10 of the result is set
-           to 1.
+       Reported as
 
-       * src/truetype/ttinterp.c: Include FT_MULTIPLE_MASTERS_H.
-       (opcode_name) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
-       (Ins_GETINFO) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Handle selector
-       bit 3, checking support for variation glyph hinting.
-       (Ins_GETVARIATION) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New function
-       to implement opcode 0x91.
-       (TT_RunIns) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Handle opcode 0x91.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=378
 
-2016-07-16  Werner Lemberg  <wl@gnu.org>
+       * src/cff/cffload.c (cff_font_load): Check element number and size
+       of Name and Top DICT indices.
 
-       [truetype] Fix GETINFO bytecode instruction.
+2017-01-04  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttinterp.c (Ins_GETINFO): Fix return value for
-       stretching information.
+       [cff, truetype] Minor tracing improvement.
 
-2016-07-16  Behdad Esfahbod  <behdad@behdad.org>
+       * src/cff/cffobjs.c (cff_face_init), src/truetype/ttobjs.c
+       (tt_face_init): Indent first tracing message from SFNT driver.
 
-       [truetype] Make all glyphs in `Zycon' GX font work.
+2017-01-03  Werner Lemberg  <wl@gnu.org>
 
-       * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Fix boundary
-       tests.
+       [truetype] Various minor fixes.
 
-2016-07-16  Werner Lemberg  <wl@gnu.org>
+       * src/truetype/ttgload.c (TT_Load_Simple_Glyph): Check instruction
+       size only if we do native hinting.
+       (TT_Load_Glyph): Trace returned error code.
 
-       [truetype] Fix GX delta tracing.
+       * src/truetype/ttobjs.c (tt_size_run_fpgm, tt_size_run_prep): Trace
+       returned error code.
+       (tt_size_ready_bytecode): Don't run `prep' table if `fpgm' table is
+       invalid.
 
-       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Trace
-       relative point movements.
+2017-01-03  Werner Lemberg  <wl@gnu.org>
 
-2016-07-16  Behdad Esfahbod  <behdad@behdad.org>
+       [sfnt] Don't fail if PCLT, EBLC (and similar tables) are invalid.
 
-       [truetype] More fixes for GX.
+       These tables are optional.
 
-       This finally fixes the rendering of the cyclist and the lizard in
-       the `Zycon' font.
+       * src/sfnt/sfobjs.c (sfnt_load_face): Implement it.
 
-       * src/truetype/ttgxvar.c (ft_var_readpackedpoints): `first' point
-       index is always cumulative.
+2017-01-03  Werner Lemberg  <wl@gnu.org>
 
-       (tt_handle_deltas): Rename to...
-       (tt_interpolate_deltas): ... This.
-       Add new parameter for output point array.
-       Update caller.
+       * src/cff/cffparse.c (cff_parse_num): Simplify.
 
-       (TT_Vary_Apply_Glyph_Deltas): Add `points_out' array; it now holds
-       the intermediate results of `tt_interpolate_deltas' that are to be
-       added to `outline->points'.
+2017-01-03  Werner Lemberg  <wl@gnu.org>
 
-2016-07-15  Werner Lemberg  <wl@gnu.org>
+       Various fixes for clang's undefined behaviour sanitizer.
 
-       * src/autofit/aflatin.c (af_latin_hints_compute_segments): Thinko.
+       * src/cff/cffload.c (FT_fdot14ToFixed): Fix casting.
+       (cff_blend_doBlend): Don't left-shift negative numbers.
+       Handle 5-byte numbers byte by byte to avoid alignment issues.
 
-       `max_pos' is always larger than `min_pos' so `FT_ABS' is not needed.
+       * src/cff/cffparse.c (cff_parse_num): Handle 5-byte numbers byte by
+       byte to avoid alignment issues.
 
-       Reported by Alexei.
+       * src/cid/cidload (cid_read_subrs): Do nothing if we don't have any
+       subrs.
 
-2016-07-16  Nikolaus Waxweiler  <madigens@gmail.com>
+       * src/psaux/t1decode.c (t1_decode_parse_charstring): Fix tracing.
 
-       * src/truetype/ttinterp.c (Ins_MIRP): Fix copy-and-paste error.
+       * src/tools/glnames.py (main): Put `DEFINE_PSTABLES' guard around
+       definition of `ft_get_adobe_glyph_index'.
 
-       Problem reported by Hin-Tak Leung.
+       * src/psnames/pstables.h: Regenerated.
 
-2016-07-15  Werner Lemberg  <wl@gnu.org>
+       * src/psnames/psmodule.c: Include `pstables.h' twice to get both
+       declaration and definition.
 
-       [autofit] Update and improve segment and edge tracing.
+       * src/truetype/ttgxvar.c (FT_fdot14ToFixed, FT_intToFixed): Fix
+       casting.
 
-       * src/autofit/afhints.c (af_glyph_hints_dump_segments): Trace
-       `delta' also.
-       Don't show first point of segment as a replacement for `pos'; this
-       is (a) misleading, since the difference to `pos' can be almost
-       arbitrarily large in corner cases, and (b) it is better to have all
-       segment data in font units instead of a single value given in output
-       space coordinates.
-       Improve layout.
-       (af_glyph_hints_dump_edges): Show px->units and units->px conversion
-       values for convenience.
-       Improve layout.
+2017-01-01  Werner Lemberg  <wl@gnu.org>
 
-2016-07-15  Werner Lemberg  <wl@gnu.org>
+       [cff] Handle multiple `blend' operators in a row correctly.
 
-       [autofit] For edges, reject segments wider than 1px (#41334).
+       Reported as
 
-       * src/autofit/afhints.h (AF_SegmentRec): New member `delta'.
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=368
 
-       * src/autofit/aflatin.c (af_latin_hints_compute_segments): Compute
-       `delta'.
-       (af_latin_hints_compute_edges): Reject segments with a delta larger
-       than 0.5px.
+       * src/cff/cffload.c (cff_blend_doBlend): Adjust `parser->stack'
+       pointers into `subFont->blend_stack' after reallocation.
 
-2016-07-14  Werner Lemberg  <wl@gnu.org>
+2017-01-01  Werner Lemberg  <wl@gnu.org>
 
-       * include/freetype/freetype.h (FT_IS_NAMED_INSTANCE): New macro.
+       [sfnt] Return correct number of named instances for TTCs.
 
-2016-07-14  Werner Lemberg  <wl@gnu.org>
+       Without this patch, requesting information for face index N returned
+       the data for face index N+1 (or index 0).
 
-       [sfnt] Fix `face_index' value in `FT_Face' for named instances.
+       * src/sfnt/sfobjs.c (sfnt_init_face): Correctly adjust `face_index'
+       for negative `face_instance_index' values.
 
-       * src/sfnt/sfobjs.c (sfnt_init_face): Don't strip off higher 16bits.
+2016-12-31  Werner Lemberg  <wl@gnu.org>
 
-2016-07-14  Werner Lemberg  <wl@gnu.org>
+       */*: Use hex numbers for errors in tracing messages.
 
-       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Fix tracing.
+2016-12-31  Werner Lemberg  <wl@gnu.org>
 
-2016-07-14  Behdad Esfahbod  <behdad@behdad.org>
+       [truetype] Check axis count in HVAR table.
 
-       [truetype] Fix gxvar delta interpolation.
+       Reported as
 
-       The coordinates of the base font should be used for interpolation
-       purposes, NOT the current points (i.e., the result of accumulation
-       of previous deltas).
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=362
 
-       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Initialize
-       `points_org' before looping over all tuples.
+       * src/truetype/ttgxvar.c (ft_var_load_hvar): Check axis count.
+       (ft_var_load_avar): Fix tracing message.
 
 
 ----------------------------------------------------------------------------
 
-Copyright 2016-2017 by
+Copyright 2016-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This file is part of the FreeType project, and may only be used, modified,
index 11376e8..63e3116 100644 (file)
 
 ----------------------------------------------------------------------------
 
-Copyright 2000-2017 by
+Copyright 2000-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This file is part of the FreeType project, and may only be used, modified,
index eff9f79..01883f1 100644 (file)
 
 ----------------------------------------------------------------------------
 
-Copyright 2002-2017 by
+Copyright 2002-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This file is part of the FreeType project, and may only be used, modified,
index e3aec74..4517c32 100644 (file)
 
        * 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).
+       Pango (see https://bugzilla.gnome.org/show_bug.cgi?id=327852).
 
 2006-02-25  Werner Lemberg  <wl@gnu.org>
 
 
        Further information on the SING Glyphlet format can be found at:
 
-         http://www.adobe.com/products/indesign/sing_gaiji.html
+         https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5148.SING_Tutorial.pdf
 
        * include/freetype/tttags.h (TTAG_SING, TTAG_META): New macros for
        the OpenType tables `SING' and `META'.  These two tables are used in
 
 ----------------------------------------------------------------------------
 
-Copyright 2005-2017 by
+Copyright 2005-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This file is part of the FreeType project, and may only be used, modified,
index 834f34d..85253f1 100644 (file)
@@ -43,7 +43,7 @@
        * 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
+       https://lists.gnu.org/archive/html/freetype-devel/2010-02/msg00003.html
 
 2010-02-10  Ken Sharp  <ken.sharp@artifex.com>
 
        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
+       https://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.
        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
+       https://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.
        On LLP64 platform, the conversion from pointer to FT_Fixed need
        to drop higher 32-bit.  Explicit casts are required. Reported by
        NightStrike from MinGW-w64 project.  See
-       http://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html
+       https://lists.gnu.org/archive/html/freetype/2009-09/msg00000.html
 
        * src/cff/cffgload.c: Convert the pointers to FT_Fixed explicitly.
 
                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
+       https://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.
 
        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
+       https://lists.gnu.org/archive/html/freetype-devel/2009-02/msg00000.html
 
 2009-07-31  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
 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.
+       https://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
        * 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.
+       https://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html.
        * docs/DEBUG: Mention on chktrcmp.py.
        * docs/release: Ditto.
 
 
        * 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
+       https://lists.gnu.org/archive/html/freetype-devel/2009-07/msg00013.html
 
 2009-07-09  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  
+       https://lists.gnu.org/archive/html/freetype-devel/2009-06/msg00031.html
+       https://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
 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
+       https://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
 
        * 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
+       https://lists.gnu.org/archive/html/freetype-devel/2009-04/msg00036.html
 
 2009-06-26  Werner Lemberg  <wl@gnu.org>
 
        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
+       https://lists.gnu.org/archive/html/freetype-devel/2008-09/msg00047.html
+       https://lists.gnu.org/archive/html/freetype-devel/2008-10/msg00000.html
 
 2009-01-07  Werner Lemberg  <wl@gnu.org>
 
        * 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.
+       https://blog.flameeyes.eu/s/canonical-target.
 
        From Savannah patch #6712.
 
        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.
+       https://trac.macports.org/ticket/15331.
 
 2008-06-21  Werner Lemberg  <wl@gnu.org>
 
        * 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
+       https://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
+       https://lists.gnu.org/archive/html/freetype-devel/2007-03/msg00032.html
 
 2007-03-19  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
+         https://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/ftobjs.c: Improvement of resource fork handler for
        POSIX, cf.
-         http://lists.gnu.org/archive/html/freetype-devel/2006-10/msg00025.html
+         https://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.
 
        `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.
+       https://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.
 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.
+       https://lists.gnu.org/archive/html/freetype-devel/2006-06/msg00057.html.
 
        * include/freetype/internal/tttypes.h (TT_GlyphZoneRec): Add
        `first_point' member.
        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
+       https://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
 
 ----------------------------------------------------------------------------
 
-Copyright 2006-2017 by
+Copyright 2006-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This file is part of the FreeType project, and may only be used, modified,
index 796763c..7661aee 100644 (file)
        Fix `checking if gcc static flag -static works' test.
 
        On my linux build tree, I receive yes answer in every package I
-       build except freetype for this test checking if gcc static flag
+       build except FreeType for this test checking if gcc static flag
        `-static' works
 
-       On freetype, no is received, unless bzip2 and zlib are disabled using
+       In FreeType, no is received, unless bzip2 and zlib are disabled using
 
          ./configure --without-bzip2 --without-zlib
 
        Most of the code is based on the ClearType whitepaper written by
        Greg Hitchcock
 
-         http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
+         https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
 
        which gives a detailed overview of the necessary changes to the
        Microsoft rasterizer so that older fonts are supported.  However, a
        NEC FA family dated in 1996 have different checksum.
        Reported by Johnson Y. Yan <yinsen_yan@foxitsoftware.com>; see
 
-         http://lists.gnu.org/archive/html/freetype-devel/2012-06/msg00023.html
+         https://lists.gnu.org/archive/html/freetype-devel/2012-06/msg00023.html
 
        * src/truetype/ttobjs.c (tt_check_trickyness_sfnt_ids): 4 sets
        of fpgm & prep table checksums for FA-Gothic, FA-Minchou,
 
        Problem reported by jola <hans-jochen.lau@lhsystems.com>; see
 
-         http://lists.gnu.org/archive/html/freetype-devel/2012-05/msg00036.html
+         https://lists.gnu.org/archive/html/freetype-devel/2012-05/msg00036.html
 
        * src/raster/ftraster.c (SMulDiv_No_Round): New macro.
        (Line_Up): Use it.
 
        See discussion starting at
 
-         http://lists.gnu.org/archive/html/freetype-devel/2012-01/msg00037.html
+         https://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/.
        `outline.flags' so that this information is preserved.  See
        discussion starting at
 
-         http://lists.gnu.org/archive/html/freetype-devel/2012-02/msg00046.html
+         https://lists.gnu.org/archive/html/freetype-devel/2012-02/msg00046.html
 
 2012-02-11  Werner Lemberg  <wl@gnu.org>
 
        [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
+       https://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.
 
        According to
 
-         http://www.gnu.org/prep/maintain/html_node/Copyright-Notices.html
+         https://www.gnu.org/prep/maintain/html_node/Copyright-Notices.html
 
        this should be mentioned explicitly.
 
 
        See
 
-         http://lists.gnu.org/archive/html/freetype-devel/2011-07/msg00049.html
+         https://lists.gnu.org/archive/html/freetype-devel/2011-07/msg00049.html
 
        for some comparison images.
 
 
        See
 
-         http://lists.gnu.org/archive/html/freetype-devel/2011-07/msg00001.html
+         https://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
        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
+       https://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00070.html
+       https://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00092.html
+       https://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
        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
+       https://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00091.html
+       https://lists.gnu.org/archive/html/freetype-devel/2011-04/msg00096.html
 
 2011-04-30  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
        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
+       https://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,
        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
+       https://lists.gnu.org/archive/html/freetype-devel/2011-02/msg00011.html
+       https://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
        [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
+         https://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.
        Johnson Y. Yan.  The bug report by Qt developers is
        considered too.
 
-       http://bugreports.qt.nokia.com/browse/QTBUG-6521
+       https://bugreports.qt.io/browse/QTBUG-6521
 
 2011-01-15  Werner Lemberg  <wl@gnu.org>
 
        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
+         https://lists.gnu.org/archive/html/freetype-devel/2010-10/msg00055.html
 
        and later mails in this thread.
 
        Problem reported by Tom Bishop <wenlin@wenlin.com>; see
        thread starting with
 
-         http://lists.gnu.org/archive/html/freetype/2010-10/msg00049.html
+         https://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.
        normal clients.
 
        For the history of these macros, see the investigation:
-       http://lists.gnu.org/archive/html/freetype/2010-10/msg00022.html
+       https://lists.gnu.org/archive/html/freetype/2010-10/msg00022.html
 
 2010-10-24  suzuki toshiya  <mpsuzuki@hiroshima-u.ac.jp>
 
        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
+               https://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
        [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.
+       https://lists.gnu.org/archive/html/freetype/2010-09/msg00019.html.
 
        * src/smooth/ftgrays.c (gray_render_cubic): Fix thinko.
 
        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
+       https://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)
        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
+       https://lists.gnu.org/archive/html/freetype-devel/2010-08/msg00021.html
+       https://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.
 
        * 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.
+       https://lists.gnu.org/archive/html/freetype-devel/2010-06/msg00020.html.
 
 2010-06-24  Werner Lemberg  <wl@gnu.org>
 
        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
+         https://lists.gnu.org/archive/html/freetype-devel/2010-06/msg00000.html
 
 2010-06-09  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
+       <https://unixforum.org/index.php?showuser=11691>.  It fixes
        FreeDesktop bug #27386.
 
        * src/base/ftlcdfil.c (FT_Library_SetLcdFilterWeights): New
 
 ----------------------------------------------------------------------------
 
-Copyright 2010-2017 by
+Copyright 2010-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This file is part of the FreeType project, and may only be used, modified,
index d7fed71..59cf2bf 100644 (file)
        Original patch is designed by Werner Lemberg.  Extra part
        for otvalid and gxvalid are added by suzuki toshiya, see
        discussion:
-       http://lists.nongnu.org/archive/html/freetype-devel/2014-12/msg00002.html
-       http://lists.nongnu.org/archive/html/freetype-devel/2014-12/msg00007.html
+       https://lists.nongnu.org/archive/html/freetype-devel/2014-12/msg00002.html
+       https://lists.nongnu.org/archive/html/freetype-devel/2014-12/msg00007.html
 
        * include/internal/ftvalid.h: Introduce FT_THROW() in FT_INVALID_().
        * src/gxvalid/gxvcommn.h: Ditto.
        for Borland's bug tracker entry.
 
        Reported by Yuliana Zigangirova <zigangirova@inbox.ru>,
-       http://lists.gnu.org/archive/html/freetype-devel/2014-04/msg00001.html.
+       https://lists.gnu.org/archive/html/freetype-devel/2014-04/msg00001.html.
 
        * include/internal/ftvalid.h (FT_ValidatorRec), src/smooth/ftgrays.c
        (gray_TWorker_): Move `ft_jmp_buf' field to be the first element.
        builds/unix/unix-def.in (freetype-config, freetype2.pc): Handle
        HarfBuzz.
 
-       * docs/INSTALL.UNIX: Document interdependency of Freetype with
+       * docs/INSTALL.UNIX: Document interdependency of FreeType with
        HarfBuzz.
 
 2014-02-28  Alexei Podtelezhnikov  <apodtele@gmail.com>
        with Carbon framework is incompatible with that by FreeType 2
        without Carbon framework.)  Found by Khaled Hosny and Hin-Tak Leung.
 
-       http://lists.gnu.org/archive/html/freetype-devel/2013-02/msg00035.html
-       http://lists.gnu.org/archive/html/freetype-devel/2013-12/msg00027.html
+       https://lists.gnu.org/archive/html/freetype-devel/2013-02/msg00035.html
+       https://lists.gnu.org/archive/html/freetype-devel/2013-12/msg00027.html
 
        * src/base/ftrfork.c (FT_Raccess_Get_DataOffsets): Add a switch
        `sort_by_res_id' to control the fragmented resource ordering.
 
        Problem reported by Hin-Tak Leung <htl10@users.sourceforge.net>; see
 
-         http://lists.nongnu.org/archive/html/freetype-devel/2013-08/msg00005.html
+         https://lists.nongnu.org/archive/html/freetype-devel/2013-08/msg00005.html
 
        for details.
 
 
        Suggested by Akira Tagoh, see
 
-         http://lists.gnu.org/archive/html/freetype/2013-09/msg00030.html
+         https://lists.gnu.org/archive/html/freetype/2013-09/msg00030.html
 
        * src/bdf/bdfdrivr.c (BDF_Face_Init): Return `Invalid_Argument'
        error if the font could be opened but non-zero `face_index' is
 
 ----------------------------------------------------------------------------
 
-Copyright 2013-2017 by
+Copyright 2013-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This file is part of the FreeType project, and may only be used, modified,
index c174b6d..ea89e91 100644 (file)
        The previous fix for #46372 misunderstood a composite glyph referring
        same component twice as a recursive reference.  See the discussion
 
-         http://lists.gnu.org/archive/html/freetype/2016-05/msg00000.html
+         https://lists.gnu.org/archive/html/freetype/2016-05/msg00000.html
 
        Thanks to Khaled Hosny for finding this issue.
 
        proper blue zones can't be defined.  However, there is already a
        proposal submitted to Unicode; see
 
-         http://www.unicode.org/L2/L2016/16034-n4707-georgian.pdf
+         https://www.unicode.org/L2/L2016/16034-n4707-georgian.pdf
 
        Additionally, due to historical reasons, Unicode treats Khutsuri as
        the same script as Mkhedruli, and so does OpenType.  However, since
 
        Problem reported by David Capello <davidcapello@gmail.com>; see
 
-         http://lists.nongnu.org/archive/html/freetype-devel/2015-10/msg00108.html
+         https://lists.nongnu.org/archive/html/freetype-devel/2015-10/msg00108.html
 
        for details.
 
 
        See
 
-         http://lists.nongnu.org/archive/html/freetype-devel/2015-07/msg00008.html
+         https://lists.nongnu.org/archive/html/freetype-devel/2015-07/msg00008.html
 
        for a rationale.
 
 
        This change is a result of a discussion thread on freetype-devel
 
-         http://lists.nongnu.org/archive/html/freetype-devel/2015-06/msg00041.html
+         https://lists.nongnu.org/archive/html/freetype-devel/2015-06/msg00041.html
 
        Re-introduce the `freetype2' subdirectory for all FreeType header
        files after installation, and rename the `freetype2' subdirectory in
 
        Problem reported by Grissiom <chaos.proton@gmail.com>; in
 
-         http://lists.nongnu.org/archive/html/freetype/2015-05/msg00013.html
+         https://lists.nongnu.org/archive/html/freetype/2015-05/msg00013.html
 
        there is an example code to trigger the bug.
 
 
        This follows the OpenType 1.7 specification.  See
 
-         http://tug.org/pipermail/tex-live/2015-April/036634.html
+         https://tug.org/pipermail/tex-live/2015-April/036634.html
 
        for a discussion.
 
 
 ----------------------------------------------------------------------------
 
-Copyright 2015-2017 by
+Copyright 2015-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This file is part of the FreeType project, and may only be used, modified,
diff --git a/ChangeLog.27 b/ChangeLog.27
new file mode 100644 (file)
index 0000000..0e82b2f
--- /dev/null
@@ -0,0 +1,2106 @@
+2016-12-30  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.7.1 released.
+       =========================
+
+
+       Tag sources with `VER-2-7-1'.
+
+       * docs/VERSION.TXT: Add entry for version 2.7.1.
+
+       * README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+       builds/windows/vc2005/index.html,
+       builds/windows/vc2008/freetype.vcproj,
+       builds/windows/vc2008/index.html,
+       builds/windows/vc2010/freetype.vcxproj,
+       builds/windows/vc2010/index.html,
+       builds/windows/visualc/freetype.dsp,
+       builds/windows/visualc/freetype.vcproj,
+       builds/windows/visualc/index.html,
+       builds/windows/visualce/freetype.dsp,
+       builds/windows/visualce/freetype.vcproj,
+       builds/windows/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.7/2.7.1/, s/27/271/.
+
+       * include/freetype/freetype.h (FREETYPE_PATCH): Set to 1.
+
+       * builds/unix/configure.raw (version_info): Set to 19:0:13.
+       * CMakeLists.txt (VERSION_PATCH): Set to 1.
+
+2016-12-30  Werner Lemberg  <wl@gnu.org>
+
+       [ftfuzzer] Replace `rand' with an xorshift algorithm.
+
+       * src/tools/ftfuzzer/ftfuzzer.cc: Don't include `stdlib.h'.
+       (Random): Implement and use a 32bit `xorshift' algorithm.
+
+2016-12-30  Werner Lemberg  <wl@gnu.org>
+
+       [ftfuzzer] Restrict number of tested bitmap strikes.
+
+       Malformed fonts often have large values for the number of bitmap
+       strikes, and FreeType doesn't check the validity of all bitmap
+       strikes in advance.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=353
+
+       * src/tools/ftfuzzer/ftfuzzer.cc: Include `stdlib.h' for `rand'.
+       (Random): Small class to provide n randomly selected numbers
+       (without repetition) out of the value set [1,N].
+       (LLVMFuzzerTestOneInput): Use it to test only up to 10 bitmap
+       strikes.
+
+2016-12-29  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Variation font API stability issues.
+
+       Make some functions work before a call to `TT_Set_MM_Blend'.
+
+       * src/truetype/ttgxvar.c (tt_hadvance_adjust): Exit immediately if
+       we don't blend.
+       (TT_Get_MM_Blend, TT_Get_Var_Design): Return default values if we
+       don't blend.
+
+2016-12-29  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Check axis data.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=348
+
+2016-12-29  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Tracing fixes.
+
+       * src/truetype/ttgxvar.c (tt_hadvance_adjust): Emit correct
+       information.
+       (TT_Set_Var_Design): Fix typo.
+       (TT_Get_Var_Design): Fix typos.
+
+2016-12-29  Werner Lemberg  <wl@gnu.org>
+
+       */*: Use `0.5f' for tracing 16.16 numbers.
+
+2016-12-29  Werner Lemberg  <wl@gnu.org>
+
+       [pcf] Protect against gzip bombs.
+
+       Fix suggested by Kostya; reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=345
+
+       * src/pcf/pcfread.c (pcf_read_TOC): Limit number of TOC entries to
+       1024.
+
+2016-12-28  Werner Lemberg  <wl@gnu.org>
+
+       [psnames] Only declare, not define, data in `pstables.h' (#49949).
+
+       Pdfium includes `pstables.h' a second time; moving the definition
+       from `pstables.h' to `psmodule.c' saves more than 60kByte data
+       segment space for this case.
+
+       * src/tools/glnames.py (StringTable::dump,
+       StringTable::dump_sublist, dump_encoding, dump_array): Emit
+       additional code to only define tables if `DEFINE_PS_TABLES' is set.
+
+       * src/psnames/pstables.h: Regenerated.
+       * src/psnames/psmodule.c (DEFINE_PS_TABLES): Define.
+
+2016-12-28  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Catch `blend' op in non-variant fonts.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=334
+
+       * src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdBLEND>: Don't
+       allow `blend' op for non-variant fonts.
+
+2016-12-28  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Better check of number of blends.
+
+       * src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdBLEND>,
+       src/cff/cffparse.c (cff_parse_blend): Compare number of blends with
+       stack size.
+
+2016-12-27  Werner Lemberg  <wl@gnu.org>
+
+       Documentation updates.
+
+       * docs/CHANGES: Add missing information.
+
+       * docs/formats.txt: Rewritten and updated.
+
+2016-12-27  Werner Lemberg  <wl@gnu.org>
+
+       [truetype, type1] Implement `FT_Get_Var_Design_Coordinates'.
+
+       * src/truetype/ttgxvar.c (TT_Get_Var_Design): Implement.
+       (TT_Set_Var_Design): Fix tracing.
+
+       * src/type1/t1load.c (T1_Get_Var_Design): Implement.
+
+2016-12-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttpload.c (tt_face_load_hdmx): Ignore `version'.
+
+       Problem reported by 張俊芝 <418092625@qq.com>.
+
+2016-12-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/ttsbit.c (tt_face_load_sbit): Allow more version values.
+
+       Some fonts seem to have the `version' field in the wrong byte order.
+
+       Problem reported by 張俊芝 <418092625@qq.com>.
+
+2016-12-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttpload.c (tt_face_load_loca): Sanitize table length.
+
+       This trivial fix allows us to accept more fonts.
+
+       Problem reported by 張俊芝 <418092625@qq.com>.
+
+2016-12-24  Werner Lemberg  <wl@gnu.org>
+
+       * src/sfnt/sfobjs.c (sfnt_init_face): Fix tracing.
+
+2016-12-22  Werner Lemberg  <wl@gnu.org>
+
+       * CMakeLists.txt: Make it work with cmake 2.8.11.2 (#49909).
+
+2016-12-22  Werner Lemberg  <wl@gnu.org>
+
+       Ensure used preprocessor symbols are defined (#49790).
+
+       * builds/unix/ftconfig.in, builds/vms/ftconfig.h,
+       include/freetype/config/ftconfig.h: Check `__GNUC__', `__IBMC__',
+       and `__SUNPRO_C' correctly.
+
+2016-12-22  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftrfork.c (FT_Raccess_Get_DataOffsets): Check `count'.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=308
+
+2016-12-22  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Protect against invalid `vsindex' and `blend' values.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=305
+
+       * src/cff/cf2intrp.c (cf2_interpT2CharString) <cf2_cmdVSINDEX,
+       cf2_cmdBLEND>: Implement it.
+
+2016-12-22  Werner Lemberg  <wl@gnu.org>
+
+       [ftfuzzer] Always use Adobe CFF engine.
+
+       * src/tools/ftfuzzer/ftfuzzer.cc (FT_Global::FT_Global): Implement
+       it.
+
+2016-12-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Thinko.
+
+       I should really stop coding late in the evening...
+
+       Thanks again to Ben for checking.
+
+2016-12-21  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Support variation fonts.
+
+       (This ChangeLog entry was added later on.)
+
+       * src/autofit/afglobal.c (af_face_globals_free): Remove useless
+       code.
+
+       * src/base/ftmm.c (FT_Set_MM_Design_Coordinates,
+       * FT_Set_Var_Design_Coordinates, FT_Set_MM_Blend_Coordinates,
+       FT_Set_Var_Blend_Coordinates): Finalize
+       auto-hinter data to enforce recomputation.  Note that this is a
+       brute-force method which should be improved.
+
+2016-12-21  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Thinko.
+
+       Don't apply deltas twice for non-phantom points.
+
+       Spotted by Ben Wagner.
+
+2016-12-21  Werner Lemberg  <wl@gnu.org>
+
+       [cff, truetype] Another try for #49829.
+
+       * src/cff/cffdrivr.c: Don't include
+       `FT_SERVICE_METRICS_VARIATIONS_H'.
+       (cff_get_advances): Use `ttface->variation_support'.
+
+       * src/truetype/ttdriver.c (tt_get_advances): Use
+       `ttface->variation_support'.
+
+       * src/truetype/ttgload.c (TT_Process_Simple_Glyph,
+       load_truetype_glyph): Use `ttface->variation_support'.
+
+2016-12-21  Werner Lemberg  <wl@gnu.org>
+
+       [truetype, sfnt] Introduce font variation flags to `TT_Face'.
+
+       * include/freetype/internal/tttypes.h (TT_FACE_FLAG_VAR_XXX):
+       New macros describing available functionality of various OpenType
+       tables related to font variation.
+       (TT_Face): New fields `variation_support' and `mvar_support',
+       replacing and extending `use_fvar'.
+
+       * src/sfnt/sfobjs.c (sfnt_init_face, sfnt_load_face): Use
+       `variation_support'.
+
+       * src/truetype/ttgxvar.c (ft_var_load_hvar): Set `variation_support'
+       field.
+       (TT_Vary_Apply_Glyph_Deltas): Updated.
+
+2016-12-21  Werner Lemberg  <wl@gnu.org>
+
+       [base] Improve sanity check for Mac resources (#49888).
+
+       * src/base/ftobjs.c (Mac_Read_sfnt_Resource): Abort if `rlen' is not
+       positive.
+
+2016-12-20  Werner Lemberg  <wl@gnu.org>
+
+       [base] More sanity checks for Mac resources.
+
+       We use
+
+         https://github.com/kreativekorp/ksfl/wiki/Macintosh-Resource-File-Format
+
+       and
+
+         https://developer.apple.com/legacy/library/documentation/mac/pdf/MoreMacintoshToolbox.pdf#page=151
+
+       as references.
+
+       * include/freetype/internal/ftrfork.h (FT_RFork_Ref): Use FT_Short
+       for `res_id'.
+
+       * src/base/ftrfork.c (FT_Raccess_Get_HeaderInfo): Extract map length
+       and use it to improve sanity checks.
+       Follow the specification more closely;in particular, all data types
+       are signed, not unsigned.
+       (FT_Raccess_Get_DataOffsets): Follow the specification more closely;
+       in particular, all data types are signed, not unsigned.
+       Add some sanity checks.
+
+2016-12-20  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Improve logic for getting fast advance widths.
+
+       * src/cff/cffdrivr.c (cff_get_advances), src/truetype/ttdriver.c
+       (tt_get_advances): Use `is_default_instance' for test; this gets
+       recomputed after changing blend coordinates.
+
+2016-12-20  Ben Wagner  <bungeman@google.com>
+           Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix linear metrics of GX variation fonts (#49829).
+
+       When asking for an unhinted non-default variations,
+       `linearVertAdvance' is currently the value from the `hmtx' table
+       instead of the actual value after applying the variation.  `HVAR'
+       support fixes this, but fonts will exist without that table and will
+       need sane fallback.
+
+       Problem also reported as
+
+         https://bugs.chromium.org/p/skia/issues/detail?id=5917
+
+       * src/truetype/ttgload.c (TT_Process_Simple_Glyph,
+       load_truetype_glyph): Implement linear advance adjustments if `HVAR'
+       or `VVAR' tables are missing.
+
+2016-12-20  Werner Lemberg  <wl@gnu.org>
+
+       [cff, truetype] Fast advance width retrieval for fonts with HVAR.
+
+       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+       * src/base/ftadvanc.c (LOAD_ADVANCE_FAST_CHECK): Don't handle MM.
+
+       * src/cff/cffdrivr.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
+       (cff_get_advances): Test for HVAR and VVAR.
+
+       * src/truetype/ttdriver.c (tt_get_advances): Test for HVAR and VVAR.
+
+2016-12-18  Werner Lemberg  <wl@gnu.org>
+
+       [base] Fix invalid mac font recursion.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=304
+
+       * src/base/ftobjs.c (FT_Open_Face): Code moved to...
+       (ft_open_face_internal): ... this function.
+       Add a parameter to control whether we try special Mac font handling
+       in case of failure.
+       (FT_Open_Face, FT_New_Face, FT_New_Memory_Face,
+       open_face_from_buffer): Use `ft_open_face_internal'.
+
+2016-12-18  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffobjs.c (cff_face_init): Make named instances work.
+
+2016-12-18  Werner Lemberg  <wl@gnu.org>
+
+       [truetype, cff] Extend `get_var_blend' function of MM service.
+
+       In particular, we need access to named instance data.
+
+       * include/freetype/internal/services/svmm.h (FT_Get_Var_Blend_Func):
+       Add argument for `FT_MM_Var'.
+
+       * src/cff/cffload.c (cff_get_var_blend): Updated.
+       * src/cff/cffload.h: Updated.
+
+       * src/cff/cf2ft.c (cf2_getNormalizedVector): Updated.
+
+       * src/truetype/ttgxvar.c (tt_get_var_blend): Updated.
+       Accept value `NULL' for arguments.
+       * src/truetype/ttgxvar.h: Updated.
+
+2016-12-18  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Handle `fvar' with zero axes as a non-MM font.
+
+       This is better behaviour than exiting with an error.
+
+       * include/freetype/internal/tttypes.h (TT_Face): Add `use_fvar'
+       field.
+
+       * src/sfnt/sfobjs.c (sfnt_init_face): Compute `use_fvar', also
+       updating the validation code.
+       Use `use_fvar' to compute FT_FACE_FLAG_MULTIPLE_MASTERS.
+
+       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Remove `fvar' validation
+       code.
+
+2016-12-18  Werner Lemberg  <wl@gnu.org>
+
+       Minor GX code shuffling.
+
+       * include/freetype/internal/tttypes.h (TT_Face): Move
+       `is_default_instance' into TT_CONFIG_OPTION_GX_VAR_SUPPORT
+       block.
+
+       * src/sfnt/sfobjs.c (sfnt_init_face): Updated.
+       * src/truetype/ttgload.c (IS_DEFAULT_INSTANCE): New macro.
+       (TT_Load_Glyph): Use it.
+
+2016-12-18  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Better handling of non-CFF font formats.
+
+       * src/cff/cffload.c (cff_font_load): Pure CFFs don't have a
+       signature, so return `FT_Err_Unknown_File_Format' more often.
+
+2016-12-17  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffload.c (cff_build_blend_vector): Remove redundant code.
+
+2016-12-17  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttobjs.c (tt_face_init): Simplify conditional code.
+
+2016-12-17  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt, truetype] Various sanitizing fixes.
+
+       * src/sfnt/sfobjs.c (sfnt_init_face): If the axis count in `fvar' is
+       zero, set `num_instances' to zero.
+
+       * src/truetype/ttgxvar.c (TT_Get_MM_Var): Handle `fvar' table with
+       zero axes as invalid.
+
+       * src/truetype/ttobjs.c (tt_face_init): Improve logic of loading
+       `loca', `cvt', `fpgm', and `prep' table.
+
+2016-12-17  Werner Lemberg  <wl@gnu.org>
+
+       Improve tracing of `FT_Open_Face'.
+
+       * src/base/ftobjs.c (FT_Open_Face): Return info on number of
+       available faces and numbered instances, or the indices of the
+       requested face and numbered instance.
+
+       * src/sfnt/sfobjs. (sfnt_open_font): Trace number of subfonts.
+
+2016-12-17  Werner Lemberg  <wl@gnu.org>
+
+       * src/cff/cffload.c (cff_load_private_dict): Always init `blend'.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=295
+
+2016-12-16  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix `cvar' sanity test.
+
+       Reported by Dave Arnold.
+
+       * src/truetype/ttgxvar.c (tt_face_vary_cvt): Use tuple count mask.
+
+2016-12-16  Werner Lemberg  <wl@gnu.org>
+
+       [cff, truetype] Remove compiler warnings; fix `make multi'.
+
+       * src/cff/cf2font.h: Include `cffload.h'.
+
+       * src/cff/cffload.c: Include FT_MULTIPLE_MASTERS_H and
+       FT_SERVICE_MULTIPLE_MASTERS_H.
+       (cff_vstore_load): Eliminate `vsSize'.
+       (cff_load_private_dict): Tag as `FT_LOCAL_DEF'.
+
+       * src/cff/cffload.h: Include `cffobjs.h'.
+       Provide declaration for `cff_load_private_dict'.
+
+       * src/truetype/ttgxvar.c (ft_var_load_hvar): Eliminate
+       `minorVersion' and `map_offset'.
+
+2016-12-16  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Fix heap buffer overflow (#49858).
+
+       * src/cff/cffparse.c (cff_parser_run): Add one more stack size
+       check.
+
+2016-12-15  Werner Lemberg  <wl@gnu.org>
+
+       Fix clang warnings.
+
+       * src/cff/cffload.c (cff_blend_doBlend): Add cast.
+       (cff_subfont_load): Set `error' correctly.
+
+       * src/sfnt/ttmtx.c (tt_face_get_metrics): Typo.
+
+2016-12-15  Dave Arnold  <darnold@adobe.com>
+           Werner Lemberg  <wl@gnu.org>
+
+       [cff] Implement CFF2 support (2/2).
+
+       The font variation code.  All parts dependent on the GX code in the
+       `truetype' module are guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+       In other words, you can still compile the `cff' module without
+       defining TT_CONFIG_OPTION_GX_VAR_SUPPORT (which brings you CFF2
+       support without font variation).
+
+       * src/cff/cf2font.c (cf2_font_setup): Add support for font
+       variation.
+       * src/cff/cf2font.h (CF2_Font): Add fields for variation data.
+
+       * src/cff/cf2ft.c (cf2_free_instance): Free blend data.
+       (cf2_getVStore, cf2_getNormalizedVector): New functions.
+       * src/cff/cf2ft.h: Updated.
+
+       * src/cff/cf2intrp.c: Include `cffload.h'.
+       (cf2_cmdRESERVED_15, cf2_cmdRESERVED_16): Replace with...
+       (cf2_cmdVSINDEX, cf2_cmdBLEND): ... this new enum values.
+       (cf2_doBlend): New function.
+       (cf2_interpT2CharString): Handle `vsindex' and `blend' opcodes.
+
+       * src/cff/cffload.c (FT_fdot14ToFixed): New macro.
+       (cff_vstore_done, cff_vstore_load): New functions.
+       (cff_blend_clear, cff_blend_doBlend, cff_blend_build_vector,
+       cff_blend_check_vector): New functions.
+       (cff_load_private_dict): Add arguments for blend vector.
+       Handle blend data.
+       (cff_subfont_load, cff_subfont_done): Updated.
+       (cff_font_load): Handle CFF2 variation store data.
+       (cff_font_done): Updated.
+       * src/cff/cffload.h: Include `cffparse.h'.
+       Updated.
+
+       * src/cff/cffobjs.c (cff_face_done): Updated.
+
+       * src/cff/cffparse.c: Include `cffload.h'.
+       (cff_parse_num): Handle internal value 255.
+       (cff_parse_vsindex, cff_parse_blend): New functions.
+       (CFF_FIELD_BLEND): New macro.
+       (cff_parser_run): Updated.
+       * src/cff/cffparse.h (cff_kind_blend): New enum value.
+
+       * src/cff/cfftoken.h: Handle `vstore', `vsindex', and `blend'
+       dictionary values.
+
+       * src/cff/cfftypes.h (CFF_VarData, CFF_AxisCoords, CFF_VarRegion,
+       CFF_VStore, CFF_Blend): New structures.
+       (CFF_FontRecDict): Add `vstore_offset' field.
+       (CFF_Private): Add `vsindex' field.
+       (CFF_SubFont): Add fields for blend data.
+       (CFF_Font): Add `vstore' field.
+
+       * src/truetype/ttgxvar.c (TT_Get_MM_Var): `CFF2' is equal to `gvar',
+       since glyph variation data is directly embedded.
+       (TT_Set_MM_Blend): Don't load `gvar' table for CFF2 fonts.
+
+2016-12-15  Dave Arnold  <darnold@adobe.com>
+           Werner Lemberg  <wl@gnu.org>
+
+       [cff] Implement CFF2 support (1/2).
+
+       This commit does not contain the blend code for font variation
+       support, which follows in another commit.
+
+       You should ignore whitespace while inspecting this commit.
+
+       * include/freetype/internal/tttypes.h (TT_Face): Add `isCFF2'
+       member.
+
+       * src/cff/cf2font.h (CF2_Font): Add `isCFF2' member.
+
+       * src/cff/cf2ft.c (cf2_decoder_parse_charstrings): Handle `isCFF2'
+       flag.
+       (cf2_getMaxstack): New function.
+       * src/cff/cf2ft.h: Updated.
+
+       * src/cff/cf2intrp.c (cf2_escRESERVED_38): New enum.
+       (cf2_interpT2CharString): Handle CFF2 differences.
+       Add tracing message for errors.
+
+       * src/cff/cffdrivr.c (cff_get_glyph_name, cff_get_name_index):
+       Update for CFF2.
+
+       * src/cff/cffload.c (FT_FIXED_ONE): New macro.
+       (cff_index_init, cff_index_load_offsets, cff_index_access_element,
+       cff_index_get_name, cff_ft_select_get, cff_load_private_dict,
+       cff_subfont_load, cff_font_load): Handle CFF2.
+       * src/cff/cffload.h: Updated.
+
+       * src/cff/cffobjs.c (cff_face_init): Handle CFF2.
+
+       * src/cff/cffparse.c (cff_parse_maxstack): New function.
+       (CFFCODE_TOPDICT, CFFCODE_PRIVATE): Removed
+       * src/cff/cffparse.h (CFF2_MAX_STACK, CFF2_DEFAULT_STACK): New
+       macros.
+       (CFF2_CODE_TOPDICT, CFF2_CODE_FONTDICT, CFF2_CODE_PRIVATE): New
+       macros.
+
+       * src/cff/cfftoken.h: Add fields for CFF2 dictionaries (but no blend
+       stuff).
+
+       * src/cff/cfftypes.h (CFF_Index): Add `hdr_size' field.
+       (CFF_FontRecDict): Add `maxstack' field.
+       (CFF_Private): Add `subfont' field.
+       (CFF_Font): Add `top_dict_length' and `cff2' fields.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Handle `CFF2' table.
+
+2016-12-15  Werner Lemberg  <wl@gnu.org>
+           Dave Arnold  <darnold@adobe.com>
+
+       [truetype] Provide HVAR advance width variation as a service.
+
+       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+       * src/truetype/ttdriver.c (tt_service_metrics_variations): Updated.
+
+       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Prevent
+       double adjustment of advance width.
+
+       * src/sfnt/ttmtx.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
+       (tt_face_get_metrics): Apply metrics variations.
+
+2016-12-15  Dave Arnold  <darnold@adobe.com>
+           Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Provide function to apply `HVAR' advance width variation.
+
+       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+       * src/truetype/ttgxvar.c (tt_hadvance_adjust): New function.
+       * src/truetype/ttgxvar.h: Updated.
+
+2016-12-15  Dave Arnold  <darnold@adobe.com>
+           Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Add `HVAR' table parsing.
+
+       Note that this is not complete yet; it only handles advance width
+       variation.
+
+       Activation of the code follows in another commit.
+
+       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+       * include/freetype/ftmm.h (FT_Var_Named_Style): Add `psid' member.
+
+       * src/truetype/ttgxvar.h (GX_HVarData, GX_AxisCoords, GX_HVarRegion,
+       GX_HVStore, GX_WidthMap): New auxiliary structures for...
+       (GX_HVarTable): ... HVAR main structure.
+       (GX_BlendRec): Add data for HVAR loading.
+
+       * src/truetype/ttgxvar.c (FT_FIXED_ONE, FT_fdot14ToFixed,
+       FT_intToFixed, FT_fixedToInt): New macros.
+       (ft_var_load_hvar): New function.
+       (TT_Get_MM_Var): Updated.
+       (tt_done_blend): Deallocate HVAR data.
+
+2016-12-15  Dave Arnold  <darnold@adobe.com>
+
+       [cff] Extend number parsing.
+
+       The forthcoming CFF2 support needs a dynamic parsing limit.
+
+       * src/cff/cffparse.c (cff_parse_num, do_fixed, cff_parse_fixed,
+       cff_parse_fixed_scaled, cff_parse_fixed_dynamic): Add argument for
+       parser.
+       (cff_parse_font_matrix, cff_parse_font_bbox, cff_parse_private_dict,
+       cff_parse_multiple_master, cff_parse_cid_ros, cff_parser_run): Updated.
+
+       * src/cff/cffparse.h (cff_parse_num): Export locally.
+
+2016-12-15  Dave Arnold  <darnold@adobe.com>
+
+       [cff] Implement dynamic stack size for Adobe engine.
+
+       This also adds `cf2_stack_setReal' and `cf2_stack_pop', needed for
+       the forthcoming CFF2 support.
+
+       * src/cff/cf2stack.c (cf2_stack_init): Add argument for stack size.
+       (cf2_stack_free): Deallocate stack.
+       (cf2_stack_count, cf2_stack_pushInt, cf2_stack_pushFixed,
+       cf2_stack_popInt, cf2_stack_popFixed, cf2_stack_getReal,
+       cf2_stack_clear): Updated.
+       (cf2_stack_setReal, cf2_stack_pop): New functions.
+
+       * src/cff/cf2stack.h (CF2_Stack): Add `stackSize' member.
+       Update function declarations.
+
+       * src/cff/cf2intrp.c (cf2_interpT2CharString): Updated.
+
+       * src/cff/cffparse.c (cff_parser_init): Add parameter for stack
+       size; return error code.
+       (cff_parser_done): New function.
+       (cff_parser_run): Updated.
+
+       * src/cff/cffparse.h (CFF_Parser): Add `stackSize' member and make
+       `stack' a pointer.
+       Update function declarations.
+
+       * src/cff/cffload.c (cff_load_private_dict, cff_subfont_load):
+       Updated.
+
+2016-12-15  Dave Arnold  <darnold@adobe.com>
+           Werner Lemberg  <wl@gnu.org>
+
+       [cff] Code shuffling.
+
+       * src/cff/cfftypes.h (CFF_Font): Add `library' and `base_offset'
+       fields.
+
+       * src/cff/cffload.c (cff_subfont_load): Change last argument to
+       `CFF_Font'
+       Split off parsing of private dictionary into...
+       (cff_load_private_dict): ...this new function.
+       (cff_font_load): Updated.
+
+2016-12-14  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt, truetype] Add framework for Metrics Variations service.
+
+       No effect yet; service functions will be implemented later on.
+
+       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+       * include/freetype/internal/services/svmetric.h: New file.
+
+       * include/freetype/internal/ftserv.h
+       (FT_SERVICE_METRICS_VARIATIONS_H): New macro.
+
+       * include/freetype/internal/tttypes.h (TT_Face): New field `var'.
+
+       * src/sfnt/sfobjs.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
+       (sfnt_init_face): Initialize `face->var'.
+
+       * src/truetype/ttdriver.c: Include FT_SERVICE_METRICS_VARIATIONS_H.
+       (tt_service_metrics_variations): New service.
+       (tt_services): Updated.
+
+       * src/truetype/ttpic.h: Updated.
+
+2016-12-14  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Add Multiple Masters service.
+
+       The code simply uses the MM functions from the `truetype' module.
+
+       Everything is guarded with TT_CONFIG_OPTION_GX_VAR_SUPPORT.
+
+       * include/freetype/internal/tttypes.h (TT_Face): New field `mm'.
+
+       * src/cff/cffdrivr.c: Include FT_SERVICE_MULTIPLE_MASTERS_H.
+       (cff_set_mm_blend, cff_get_mm_blend, cff_get_mm_var,
+       cff_set_var_design, cff_get_var_design): New functions.
+       (cff_service_multi_masters): New service.
+       (cff_services): Updated.
+
+       * src/cff/cffload.c (cff_get_var_blend, cff_done_blend): New
+       functions.
+       * src/cff/cffload.h: Updated.
+
+       * src/cff/cffpic.h (CFF_SERVICE_MULTI_MASTERS_GET): New macro.
+
+       * src/sfnt/sfobjs.c: Include FT_SERVICE_MULTIPLE_MASTERS_H.
+       (sfnt_init_face): Initialize `face->mm'.
+
+2016-12-14  Werner Lemberg  <wl@gnu.org>
+
+       Extend functionality of `ft_module_get_service'.
+
+       It can now differentiate between local and global searches.
+
+       * src/base/ftobjs.c (ft_module_get_service): Add `global' argument.
+       (FT_Get_TrueType_Engine_Type): Updated.
+
+       * src/cff/cffdrivr.c (cff_get_ps_name, cff_get_cmap_info): Updated.
+
+       * include/freetype/internal/ftobjs.h: Updated.
+       * include/freetype/internal/ftserv.h (FT_FACE_FIND_GLOBAL_SERVICE):
+       Updated.
+
+2016-12-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgxvar.c (tt_get_var_blend): Fix compiler warning.
+
+2016-12-14  Dave Arnold  <darnold@adobe.com>
+           Werner Lemberg  <wl@gnu.org>
+
+       [sfnt, cff] Minor preparations.
+
+       * include/freetype/tttags.h (TTAG_CFF2, TTAG_HVAR, TTAG_MVAR,
+       TTAG_VVAR): New SFNT table tags.
+
+       * src/cff/cf2fixed.h (CF2_FIXED_ONE, CF2_FIXED_EPSILON): Add cast.
+
+2016-12-10  Werner Lemberg  <wl@gnu.org>
+
+       [truetype, type1] Add `get_var_blend' to MM service.
+
+       For internal use; we want to share code between the forthcoming CFF2
+       support and TrueType.
+
+       * include/freetype/internal/services/svmm.h (FT_Get_Var_Blend_Func):
+       New typedef.
+       (MultiMasters): Add `get_var_blend'.
+       (FT_Service_MultiMasters): Updated.
+
+       * src/truetype/ttgxvar.c (tt_get_var_blend): New function.
+       * src/truetype/ttgxvar.h: Updated.
+
+       * src/truetype/ttdriver.c (tt_service_gx_multi_masters): Updated.
+       * src/type1/t1driver.c (t1_service_multi_masters): Updated.
+
+2016-12-10  Werner Lemberg  <wl@gnu.org>
+
+       [truetype, type1] Add `done_blend' to MM service.
+
+       For internal use; we want to share code between the forthcoming CFF2
+       support and TrueType.
+
+       * include/freetype/internal/services/svmm.h (FT_Done_Blend_Func):
+       New typedef.
+       (MultiMasters): Add `done_blend'.
+       (FT_Service_MultiMasters): Updated.
+
+       * src/truetype/ttgxvar.c (tt_done_blend): Use `TT_Face' as argument.
+       * src/truetype/ttgxvar.h: Updated.
+
+       * src/truetype/ttobjs.c (TT_Face_Done): Updated.
+
+       * src/truetype/ttdriver.c (tt_service_gx_multi_masters): Updated.
+       * src/type1/t1driver.c (t1_service_multi_masters): Updated.
+
+2016-12-09  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Revert change from 2016-12-08.
+
+       I missed the functionality of `ft_module_get_service', which makes
+       the change unnecessary.
+
+2016-12-08  Werner Lemberg  <wl@gnu.org>
+
+       Add framework to support services with 8 functions.
+
+       We will need this for CFF variation font support.
+
+       * include/freetype/internal/ftserv.h (FT_DEFINE_SERVICEDESCREC8):
+       New macro.
+
+2016-12-08  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Add `get_glyph_name' and `get_name_index' to SFNT interface.
+
+       CFF2 fonts will need access to those two functions.
+
+       * include/freetype/internal/sfnt.h: Include FT_SERVICE_GLYPH_DICT_H.
+       (SFNT_Interface): Add `get_glyph_name' and `get_name_index' members.
+       (FT_DEFINE_SFNT_INTERFACE): Updated.
+
+       * src/sfnt/sfdriver.c (sfnt_get_glyph_name, sfnt_get_name_index):
+       Fix signatures to exactly correspond to the glyph dict service
+       function typedefs.
+       (sfnt_interface): Updated.
+
+2016-12-06  Dave Arnold  <darnold@adobe.com>
+
+       Add `FT_Get_Var_Design_Coordinates' function.
+
+       Note that the low-level functions aren't implemented yet.
+
+       * include/freetype/ftmm.h: Declare.
+
+       * include/freetype/internal/services/svmm.h
+       (FT_Get_Var_Design_Func): New typedef.
+       (MultiMasters): New MM service function `get_var_design'.
+       (FT_DEFINE_SERVICE_MULTIMASTERSREC): Updated.
+       Update all callers.
+
+       * src/base/ftmm.c (FT_Get_Var_Design_Coordinates): Implement.
+
+       * src/truetype/ttdriver.c: Updated.
+
+       * src/truetype/ttgxvar.c (TT_Get_Var_Design): New dummy function to
+       handle `get_var_design' service.
+       * src/truetype/ttgxvar.h: Updated.
+
+       * src/type1/t1driver.c: Updated.
+
+       * src/type1/t1load.c (T1_Get_Var_Design): New dump function to
+       handle `get_var_design' service.
+       * src/type1/t1load.h: Updated.
+
+2016-12-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_subrs): Fix memory leak.
+
+       The `subrs' keyword might erroneously occur multiple times.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=231
+
+2016-12-01  Werner Lemberg  <wl@gnu.org>
+
+       [gzip] Improve building with external zlib (#49673).
+
+       Building FreeType with external zlib 1.2.8 makes msvc 14 stop with
+       the following error.
+
+         ftgzip.c
+         zlib-1.2.8\zlib.h(86): error C2061:
+                                syntax error: identifier 'z_const'
+         zlib-1.2.8\zlib.h(94): error C2054:
+                                expected '(' to follow 'z_const'
+         zlib-1.2.8\zlib.h(94): error C2085:
+                                'msg': not in formal parameter list
+         ...
+         zlib-1.2.8\zlib.h(877): fatal error C1003:
+                                 error count exceeds 100; stopping compilation
+
+       The error happens because FreeType keeps an own copy of zlib-1.1.4
+       under `src/gzip'.  When building `src/gzip/ftgzip.c' with
+       FT_CONFIG_OPTION_SYSTEM_ZLIB defined, it uses
+
+         #include <zlib.h>
+
+       which correctly finds an external `zlib.h', but `zlib.h' itself has
+       a line
+
+         #include "zconf.h"
+
+       which makes Visual Studio 2015 find `src/gzip/zconf.h' while
+       compiling the files in `src/gzip'.
+
+       * src/gzip/zconf.h: Rename to...
+       * src/gzip/ftzconf.h: ... this.
+       * src/gzip/zlib.h, src/gzip/rules.mk (GZIP_DRV_SRCS): Updated.
+
+2016-12-01  Oleksandr Chekhovskyi  <oleksandr.chekhovskyi@gmail.com>
+
+       [autofit] Fix Emscripten crash (patch #9180).
+
+       Function calls through pointers must use a matching signature to
+       work on Emscripten, since such calls are dispatched through lookup
+       tables grouped by signature.
+
+       * src/autofit/aftypes.h (AF_WritingSystem_ApplyHintsFunc): Fix
+       typedef.
+
+2016-11-29  Werner Lemberg  <wl@gnu.org>
+
+       [smooth] Revert previous commit.  Already fixed with 6ca54c64.
+
+2016-11-29  Werner Lemberg  <wl@gnu.org>
+
+       [smooth] Avoid conditional jump on uninitialized value (#49711).
+
+       * src/smooth/ftgrays.c (gray_raster_render): Initialize `worker'.
+
+2016-11-27  Nikolaus Waxweiler  <madigens@gmail.com>
+
+       [autofit] Code shuffling.
+
+       Also improve some comments and remove unused code.
+
+       No functional change.
+
+       * src/autofit/afloader.c (af_loader_load_g): Merged with...
+       (af_loader_load_glyph): ...this function.
+       Split off emboldening code into...
+       (af_loader_embolden_glyph_in_slot): ... this function.
+
+2016-11-17  Werner Lemberg  <wl@gnu.org>
+
+       Better support of LLP64 systems with gcc (and clang).
+
+       * builds/unix/configure.raw: Call `AC_TYPE_LONG_LONG_INT'.
+
+       * builds/unix/ftconfig.in (FT_LONG64): Enable for LLP64 systems (and
+       suppress warnings) even without `FT_CONFIG_OPTION_FORCE_INT64'.
+
+2016-11-10  Werner Lemberg  <wl@gnu.org>
+
+       Fix `lcd_weights' array size.
+
+       * include/freetype/internal/ftobjs.h (FT_LibraryRec): Do it.
+
+       Reported by Nikolaus.
+
+2016-11-06  Werner Lemberg  <wl@gnu.org>
+
+       * src/base/ftobjs.c (FT_Render_Glyph_Internal): Fix tracing.
+
+2016-11-06  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Improve FT_LOAD_BITMAP_METRICS_ONLY for `sbix' format.
+
+       It's unavoidable to call the PNG engine, but to get the metrics it
+       is sufficient to read the PNG image's header only.
+
+       * src/sfnt/pngshim.c (Load_SBit_Png): Add argument to control the
+       allocation of the glyph slot.
+       * src/sfnt/pngshim.h: Updated.
+       * src/sfnt/ttsbit.c (tt_sbit_decoder_load_png,
+       tt_face_load_sbix_image, tt_face_load_sbit_image): Updated.
+
+2016-11-06  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Speed up `sbix' lookup.
+
+       This also fixes a bug introduced in 2016-10-01 which prevents
+       display of embedded bitmap fonts that use the `sbix' format.
+
+       * src/sfnt/ttsbit.c (tt_face_load_sbit): Store `sbix' size and
+       offset also in `ebdt_size' and `ebdt_start', respectively.  This
+       makes the test for an embedded bitmap data table succeed for this
+       format.
+
+       (tt_face_load_strike_metrics) <TT_SBIT_TABLE_TYPE_SBIX>: Use
+       `ebdt_size' and `ebdt_start'
+       (tt_face_load_sbix_image): Ditto.
+
+2016-11-06  Seigo Nonaka  <nona@google.com>
+           Werner Lemberg  <wl@gnu.org>
+
+       Introduce a way of quickly retrieving (embedded) bitmap metrics.
+
+       `FT_Load_Glyph' doesn't generate a bitmap for a non-bitmap glyph
+       until the user calls `FT_Render_Glyph'.  However, it always
+       allocates memory for bitmaps and copies or decodes the contents of a
+       bitmap glyph, which can be quite slow for PNG data.
+
+       * include/freetype/freetype.h (FT_LOAD_BITMAP_METRICS_ONLY): New
+       macro.
+
+       * src/base/ftobjs.c (FT_Load_Glyph): Unset FT_LOAD_RENDER if
+       FT_LOAD_BITMAP_METRICS_ONLY is used.
+
+       * src/sfnt/ttsbit.c (tt_sbit_decoder_alloc_bitmap,
+       tt_sbit_decoder_load_bitmap): Add argument to control allocation of
+       the glyph slot.
+       (tt_sbit_decoder_load_image, tt_sbit_decoder_load_compound,
+       tt_face_load_sbit_image): Updated.
+
+       * src/pcf/pcfdrivr.c (PCF_Glyph_Load): Quickly exit if
+       `FT_LOAD_BITMAP_METRICS_ONLY' is set.
+
+       * src/pfr/pfrsbit.c, src/pfr/pfrsbit.h (pfr_slot_load_bitmap): Add
+       argument to control allocation of the glyph slot.
+       * src/pfr/pfrobjs (pfr_slot_load): Updated.
+
+       * src/winfonts/winfnt.c (FNT_Load_Glyph): Ditto.
+
+       * docs/CHANGES: Updated.
+
+2016-11-06  Werner Lemberg  <wl@gnu.org>
+
+       Synchronize with gnulib (#49448).
+
+       * include/freetype/config/ftconfig.h, builds/unix/ftconfig.in,
+       builds/vms/ftconfig.h (FT_TYPEOF): Update code to use definition in
+       current version of `intprops.h'.
+       Other minor synchronization to reduce code differences between the
+       three files.
+
+2016-11-03  Behdad Esfahbod  <behdad@behdad.org>
+
+       [truetype] Clamp variation requests to valid range.
+
+       This is required by OpenType 1.8; it also avoids rounding surprises.
+
+       * src/truetype/ttgxvar.c (TT_Set_Var_Design): Clamp design coordinates
+       outside of the allowed range to always stay within the range instead
+       of producing an error.
+
+2016-10-29  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Remove clang warnings.
+
+       * src/truetype/ttinterp.h (TT_ExecContextRec): Using `FT_ULong' for
+       loop counter handling.
+
+       * src/truetype/ttinterp.c: Updated.
+       (Ins_SCANTYPE): Use signed constant.
+       (TT_RunIns): Ensure `num_twilight_points' is 16bit.
+
+2016-10-27  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix commit from 2014-11-24.
+
+       Problem reported by Hin-Tak Leung  <htl10@users.sourceforge.net>.
+
+       * src/truetype/ttpload.c (tt_face_load_hdmx): Fix file checking
+       logic.
+
+2016-10-26  Werner Lemberg  <wl@gnu.org>
+
+       Add `FT_Get_{MM,Var}_Blend_Coordinates' functions.
+
+       * include/freetype/ftmm.h: Declare.
+
+       * include/freetype/internal/services/svmm.h (FT_Get_MM_Blend_Func):
+       New typedef.
+       (MultiMasters): New MM service function `get_mm_blend'.
+       (FT_DEFINE_SERVICE_MULTIMASTERSREC): Updated.
+       Update all callers.
+
+       * src/base/ftmm.c (FT_Get_MM_Blend_Coordinates,
+       FT_Get_Var_Blend_Coordinates): Implement.
+
+       * src/truetype/ttdriver.c: Updated.
+
+       * src/truetype/ttgxvar.c (TT_Get_MM_Blend): New function to handle
+       `get_mm_blend' service.
+       * src/truetype/ttgxvar.h: Updated.
+
+       * src/type1/t1driver.c: Updated.
+
+       * src/type1/t1load.c (T1_Get_MM_Blend): New function to handle
+       `get_mm_blend' service.
+       * src/type1/t1load.h: Updated.
+
+       * docs/CHANGES: Document.
+
+2016-10-26  Werner Lemberg  <wl@gnu.org>
+
+       * src/type1/t1load.c (parse_subrs): Fix limit check.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=81
+
+2016-10-25  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [cff] Correct cmap format reporting (#24819).
+
+       * src/cff/cffdrivr.c (cff_get_cmap_info): Throw an error on synthetic
+       charmap instead of guessing its format and language.
+
+2016-10-22  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix SCANTYPE instruction (#49394).
+
+       * src/truetype/ttinterp.c (Ins_SCANTYPE): Only use lower 16bits.
+
+2016-10-22  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Improve handling of invalid post 2.5 tables [#49393].
+
+       * src/sfnt/ttpost.c (load_format_25): We need at least a single
+       table entry.
+
+2016-10-14  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix handling of `cvar' table data.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=53
+
+       * src/truetype/ttgxvar.c (tt_face_vary_cvt): Ignore invalid CVT
+       indices.
+
+2016-10-11  Werner Lemberg  <wl@gnu.org>
+
+       [psaux] Fix handling of invalid flex subrs.
+
+       Problem reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=52
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings)
+       <op_callothersubr>: Set `flex_state' after error checking.
+
+2016-10-11  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgxvar.c (tt_done_blend): Fix deallocation.
+
+2016-10-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/cid/cidload.c (cid_face_open): Properly propagate `error'.
+
+2016-10-08  Werner Lemberg  <wl@gnu.org>
+
+       [cid] Fix parsing of subr offsets.
+
+       Bug introduced 2016-05-16.
+
+       * src/cid/cidparse.c (cid_parser_new): Fix off-by-one error.
+
+2016-10-01  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Disable bitmap strikes if we don't have a bitmap data table.
+
+       * src/sfnt/ttsbit.c (tt_face_load_sbit): Check whether we have
+       a bitmap data table.
+
+2016-10-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [smooth] Remove impossibility.
+
+       * src/smooth/ftgrays.c (TWorker): Rearrange fields.
+       (gray_convert_glyph): Remove impossible condition and clean up.
+
+2016-09-29  Werner Lemberg  <wl@gnu.org>
+
+       [pcf] Enrich family name with foundry name and glyph width info.
+
+       This is a very old patch from openSuSE (from 2006, submitted to
+       FreeType in 2011) that I forgot to apply.
+
+         https://build.opensuse.org/package/view_file/openSUSE:Factory/freetype2/freetype2-bitmap-foundry.patch
+
+       Prepend the foundry name plus a space to the family name.  There are
+       many fonts just called `Fixed' which look completely different, and
+       which have nothing to do with each other.  When selecting `Fixed' in
+       KDE or Gnome one gets results that appear rather random, the style
+       changes often if one changes the size and one cannot select some
+       fonts at all.
+
+       We also check whether we have `wide' characters; all put together,
+       we get family names like `Sony Fixed' or `Misc Fixed Wide'.
+
+       * src/pcf/pcfread.c (pcf_load_font): Implement it.
+
+       * docs/CHANGES: Document it.
+
+2016-09-29  Werner Lemberg  <wl@gnu.org>
+
+       [ftfuzzer] Speed up.
+
+       * src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Don't
+       check for embedded bitmaps if we have a non-default instance.
+
+2016-09-29  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Disallow bitmap strikes for non-default instances.
+
+       Also speed up access of default instances if GX variations are
+       active.
+
+       * include/freetype/internal/tttypes.h (TT_FaceRec): Add
+       `is_default_instance' member.
+
+       * src/sfnt/sfobjs.c (sfnt_init_face): Initialize
+       `is_default_instance'.
+
+       * src/truetype/ttgload.c (TT_Process_Simple_Glyph,
+       load_truetype_glyph): Add test for default instance.
+       (TT_Load_Glyph): Load embedded bitmaps for default instance only.
+
+       * src/truetype/ttgxvar.c (TT_Set_MM_Blend): Compute
+       `is_default_instance'.
+
+2016-09-29  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Clean up `TT_Face' structure.
+
+       * include/freetype/internal/tttypes.h (TT_FaceRec): Remove unused
+       fields `horz_metrics' and `vert_metrics'.
+       Update documentation.
+
+       * src/sfnt/sfobjs.c (sfnt_done_face): Updated.
+
+2016-09-28  Werner Lemberg  <wl@gnu.org>
+
+       More FT_ZERO usage.
+
+       * src/gxvalid/gxvcommn.c (gxv_ClassTable_validate):
+       s/ft_memset/FT_MEM_ZERO/.
+
+       * src/psaux/t1decode.c (t1_decoder_parse_charstrings):
+       s/ft_memset/FT_ARRAY_ZERO/.
+
+       * src/raster/ftraster.c (FT_ZERO): Define.
+       (ft_black_new): Use it.
+       * src/raster/ftrend1.c (ft_raster1_get_cbox):
+       s/FT_MEM_ZERO/FT_ZERO/.
+
+       * src/smooth/ftgrays.c (FT_ZERO): Define.
+       (gray_raster_new): Use it.
+       * src/smooth/ftsmooth.c (ft_smooth_get_cbox):
+       s/FT_MEM_ZERO/FT_ZERO/.
+
+2016-09-28  Werner Lemberg  <wl@gnu.org>
+
+       */*: s/FT_MEM_ZERO/FT_ZERO/ where appropriate.
+
+2016-09-27  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Trace number of executed opcodes.
+
+       * src/truetype/ttinterp.c (TT_RunIns): Implement it.
+
+2016-09-27  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Speed up `TT_Load_Glyph'.
+
+       This avoids additional calls to `tt_face_lookup_table' for the
+       `glyf' table, which can be expensive.
+
+       * include/freetype/internal/tttypes.h (TT_LoaderRec): Move
+       `glyf_offset' field to ...
+       (TT_FaceRec): ... this structure.
+       * src/truetype/ttgload.c (load_truetype_glyph): Updated.
+       (tt_loader_init): Move initialization of `glyf_offset' to ...
+       * src/truetype/ttpload.c (tt_face_load_loca): ... this function.
+
+2016-09-27  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Introduce dynamic limits for some bytecode opcodes.
+
+       This speeds up FreeType's handling of malformed fonts.
+
+       * src/truetype/ttinterp.c (TT_RunIns): Set up limits for the number
+       of twilight points, the total number of negative jumps, and the
+       total number of loops in LOOPCALL opcodes.  The values are based on
+       the number of points and entries in the CVT table.
+       (Ins_JMPR): Test negative jump counter.
+       (Ins_LOOPCALL): Test loopcall counter.
+
+       * src/truetype/ttinterp.h (TT_ExecContext): Updated.
+
+       * docs/CHANGES: Updated.
+
+2016-09-25  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Sanitize only last entry of `loca' table.
+
+       Without this patch, a loca sequence like `0 100000 0 100000 ...',
+       where value 100000 is larger than the `glyf' table size, makes
+       FreeType handle the whole `glyf' table as a single glyph again and
+       again, which is certainly invalid (and can be very slow, too).
+
+       * src/truetype/ttpload.c (tt_face_get_location): Implement.
+       Improve tracing messages.
+
+2016-09-25  Werner Lemberg  <wl@gnu.org>
+
+       * src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Fix typo.
+
+2016-09-24  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Tracing fixes.
+
+       * src/autofit/afmodule.c (af_autofitter_load_glyph): Call dumping
+       functions only if we actually do tracing.
+
+2016-09-22  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [smooth] Reduce divisions in the line renderer.
+
+       We don't need some divisions if a line segments stays within a single
+       row or a single column of pixels.
+
+       * src/smooth/ftgrays.c (gray_render_line) [FT_LONG64]: Make divisions
+       conditional.
+
+2016-09-15  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       * src/smooth/ftgrays.c (gray_sweep): Remove check for empty table.
+
+2016-09-14  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [smooth] Another tiny speed-up.
+
+       * src/smooth/ftgrays.c (gray_find_cell): Merge into...
+       (gray_record_cell): ... this function.
+
+2016-09-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       * src/smooth/ftgrays.c (gray_{find,set}_cell): Remove dubious code.
+
+2016-09-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [smooth] Fix valgrind warning and reoptimize.
+
+       The algorithm calls `gray_set_cell' at the start of each new contour
+       or when the contours cross the cell boundaries. Double-checking for
+       that is wasteful.
+
+       * src/smooth/ftgrays.c (gray_set_cell): Remove check for a new cell.
+       (gray_convert_glyph): Remove initialization introduced by 44b172e88.
+
+2016-09-10  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Fix previous commit.
+
+       Problems reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=40
+
+       We now map the strike index right before accessing the physical
+       data, not earlier.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Set `face->sbit_strike_map'
+       after creating the map so that...
+
+       * src/sfnt/ttsbit.c (tt_face_load_strike_metrics): ... this function
+       can be used before and after setting up `sbit_strike_map'.
+       (tt_face_set_sbit_strike): Revert change.
+       (tt_sbit_decoder_init, tt_face_load_sbix_image): Map strike index.
+
+       * src/truetype/ttdriver.c (tt_size_select): Revert change.
+
+2016-09-09  Werner Lemberg  <wl@gnu.org>
+
+       [ftfuzzer] Minor improvements.
+
+       * src/tools/ftfuzzer/ftfuzzer.cc (LLVMFuzzerTestOneInput): Ignore
+       invalid strikes.
+       Use better values for call to `FT_Set_Char_Size'.
+
+2016-09-09  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Don't provide (completely) broken strike data.
+
+       FreeType tries to sanitize strike header data; we now reject
+       completely broken ones.
+
+       * include/freetype/internal/tttypes.h (TT_FaceRec): New
+       `sbit_strike_map' array pointer.
+
+       * src/base/ftobjs.c (FT_Match_Size): Reject matches where either
+       width or height would be zero.
+       Add tracing message in case of error.
+
+       * src/sfnt/sfobjs.c (sfnt_load_face): Populate `sbit_strike_map',
+       only using (more or less) valid strike header data for
+       FT_Face's `available_sizes' array.
+       (sfnt_done_face): Updated.
+
+       * src/sfnt/ttsbit.c (tt_face_set_sbit_strike): Use
+       `sbit_strike_map'.
+       (tt_face_load_strike_metrics): Improve tracing.
+
+       * src/truetype/ttdriver.c (tt_size_select): Use `sbit_strike_map'.
+
+2016-09-08  Werner Lemberg  <wl@gnu.org>
+
+       * Version 2.7 released.
+       =======================
+
+
+       Tag sources with `VER-2-7'.
+
+       * docs/VERSION.TXT: Add entry for version 2.7.
+
+       * README, Jamfile (RefDoc), builds/windows/vc2005/freetype.vcproj,
+       builds/windows/vc2005/index.html,
+       builds/windows/vc2008/freetype.vcproj,
+       builds/windows/vc2008/index.html,
+       builds/windows/vc2010/freetype.vcxproj,
+       builds/windows/vc2010/index.html,
+       builds/windows/visualc/freetype.dsp,
+       builds/windows/visualc/freetype.vcproj,
+       builds/windows/visualc/index.html,
+       builds/windows/visualce/freetype.dsp,
+       builds/windows/visualce/freetype.vcproj,
+       builds/windows/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.6.5/2.7/, s/265/27/.
+
+       * include/freetype/freetype.h (FREETYPE_MINOR): Set to 7.
+       (FREETYPE_PATCH): Set to 0.
+
+       * builds/unix/configure.raw (version_info): Set to 18:6:12.
+       * CMakeLists.txt (VERSION_MINOR): Set to 7.
+       (VERSION_PATCH): Set to 0.
+
+       * docs/CHANGES: Updated.
+
+2016-09-08  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttinterp.c: Include `ttgxvar.h'.
+
+       This fixes the `multi' build.
+
+2016-09-08  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Another improvement to Armenian support.
+
+       Suggested by Hrant H Papazian <hpapazian@gmail.com>.
+
+       * src/autofit/afscript.h: Use better suited characters to derive
+       default stem widths.
+
+2016-09-07  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       * src/smooth/ftgrays.c (gray_hline): Micro-optimize.
+
+2016-09-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [smooth] Operate in absolute bitmap coordinates.
+
+       Simpler bitmap addressing improves performance by 1.5%.
+
+       * src/smooth/ftgrays.c (gray_TWorker): Remove count fields.
+       (gray_dump_cells, gray_find_cell, gray_set_cell, gray_hline,
+       gray_sweep, gray_convert_glyph, gray_raster_render): Updated.
+
+2016-09-06  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [smooth] Improve contour start (take 2).
+
+       * src/smooth/ftgrays.c (gray_move_to): Call `gray_set_cell' directly
+       instead of...
+       (gray_start_cell): ... this function, which is removed.
+       (gray_convert_glyph): Make initial y-coordinate invalid.
+
+2016-09-06  Werner Lemberg  <wl@gnu.org>
+
+       [type1] MM fonts support exactly zero named instances (#48748).
+
+       * src/type1/t1load.c (T1_Get_MM_Var): Set `num_namedstyles' to zero.
+
+2016-09-06  Jonathan Kew  <jfkthame@gmail.com>
+
+       [cff] Fix uninitialized memory.
+
+       Problem reported as
+
+         https://bugzilla.mozilla.org/show_bug.cgi?id=1270288
+
+       * src/cff/cf2intrp.c (cf2_interpT2CharString): Initialize `storage'
+       array to handle a `get' opcode without a previous `put'.
+
+2016-09-05  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       * src/smooth/ftgrays.c (gray_move_to, gray_start_cell): Revert.
+
+2016-09-05  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [smooth] Improve contour start.
+
+       * src/smooth/ftgrays.c (gray_move_to): Call `gray_set_cell' directly
+       instead of...
+       (gray_start_cell): ... this function, which is removed.
+
+2016-09-05  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Fix memory initialization.
+
+       * src/cff/cf2stack.c (cf2_stack_init): Use `FT_NEW'.  The `Q'
+       variants of FreeType's memory allocation macros don't do zeroing.
+
+2016-09-05  Werner Lemberg  <wl@gnu.org>
+
+       [ftrandom] Minor improvements.
+
+       * src/tools/ftrandom/ftrandom.c (_XOPEN_SOURCE): New macro, set to
+       500.
+
+       * src/tools/ftrandom/Makefile (CFLAGS): Split off include
+       directories to ...
+       (INCLUDES): ... this new variable.
+       (LDFLAGS): New variable.
+       (ftrandom.o, ftrandom): Updated.
+
+2016-09-05  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Improve Armenian support.
+
+       Thanks to Hrant H Papazian <hpapazian@gmail.com> for help.
+
+       * src/autofit/afblue.dat (AF_BLUE_STRING_ARMENIAN_*): Improve
+       selection of characters.
+
+       * src/autofit/afblue.c, src/autofit/afblue.h: Regenerated.
+
+2016-09-04  Werner Lemberg  <wl@gnu.org>
+
+       [ftrandom] Improve Makefile.
+
+       It now supports both a normal build (`./configure && make') and a
+       development build (`make devel').
+
+       * src/tools/ftrandom/Makefile (VPATH): Set it so that
+       `libfreetype.a' gets searched in both `objs' (for the development
+       build) and `objs/.libs' (for a normal build which uses libtool).
+       (LIBS): Add missing libraries.
+       (ftrandom.o): New rule.
+       (ftrandom): Use automatic variables.
+
+2016-09-03  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] More fixes for handling of GX deltas.
+
+       Problems reported by Bob Taylor <Bob.Taylor@monotype.com>.
+
+       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Fix rough
+       sanity test for glyph variation array header size.
+       Always set stream position before reading packed x and y deltas.
+       Fix thinko w.r.t. `localpoints' array.
+
+2016-09-03  Werner Lemberg  <wl@gnu.org>
+
+       [ftrandom] Various fixes.
+
+       * src/tools/ftrandom/ftrandom.c (GOOD_FONTS_DIR): Provide better
+       default.
+       (error_fraction): Make it of type `double' to work as advertized –
+       this was completely broken.
+       Update all related code.
+       (error_count, fcnt): Make it unsigned to fix compiler warnings.
+       Update all related code.
+       (fontlist): Change `len' member to `long' to fix compiler warnings.
+       (FT_MoveTo, FT_LineTo, FT_ConicTo, FT_CubicTo, abort_test): Tag
+       unused variables.
+       (TestFace, FindFonts, copyfont, do_test): Fix compiler warnings.
+       (ExecuteTest): Ditto.
+       Call `FT_Done_FreeType'.
+       (getErrorCnt): Replace `ceil' with an ordinary cast to `unsigned
+       int'.
+       (usage): Improve output.
+       (main): Fix compiler warnings.
+
+       * src/tools/ftrandom/README: Updated.
+
+2016-09-03  Werner Lemberg  <wl@gnu.org>
+
+       [base] Avoid negative bitmap strike dimensions (#48985).
+
+       * src/base/ftobjs.c (FT_Open_Face): Check whether negation was
+       actually successful.  For example, this can fail for value
+       -32768 if the type is `signed short'.  If there are problems,
+       disable the strike.
+
+2016-09-03  Werner Lemberg  <wl@gnu.org>
+
+       [cff] Avoid null pointer passed to FT_MEM_COPY (#48984).
+
+       * src/cff/cffload.c (cff_index_get_name): Check `byte_len'.
+
+2016-09-02  Werner Lemberg  <wl@gnu.org>
+
+       [unix] Enable 64bit support in file system access (#48962).
+
+       * builds/unix/configure.raw: Call `AC_SYS_LARGEFILE'.
+
+2016-09-02  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Avoid left shift of negative value (#48980).
+
+       * src/sfnt/ttsbit.c (tt_sbit_decoder_load_bit_aligned): Use unsigned
+       constant.
+
+2016-09-02  Werner Lemberg  <wl@gnu.org>
+
+       * src/smooth/ftgrays.c (gray_hline): Fix clang compiler warnings.
+
+2016-09-02  Werner Lemberg  <wl@gnu.org>
+
+       Some preparations for the next release.
+
+       * include/freetype/config/ftoption.h
+       (TT_CONFIG_OPTION_SUBPIXEL_HINTING): Enable.
+
+       * docs/CHANGES: Updated.
+
+2016-09-01  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [smooth] Simplify span rendering more.
+
+       It turns out that there is significant cost associated with `FT_Span'
+       creation and calls to `gray_render_span' because it happens so
+       frequently. This removes these steps from our internal use but leaves
+       it alone for `FT_RASTER_FLAG_DIRECT" to preserve API. The speed gain
+       is about 5%.
+
+       * src/smooth/ftgrays.c (gray_render_span): Removed. The code is
+       migrated to...
+       (gray_hline): ... here.
+
+2016-08-30  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [smooth] Streamline pixmap drawing a bit more.
+
+       Zero coverage is unlikely (1 out of 256) to warrant checking. This
+       gives 0.5% speed improvement in rendering simple glyphs.
+
+       * src/smooth/ftgrays.c (gray_hline, gray_render_span): Remove checks.
+
+2016-08-29  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [smooth] Streamline pixmap drawing.
+
+       This gives 2% speed improvement in rendering simple glyphs.
+
+       * src/smooth/ftgrays.c (TPixmap): Reduced pixmap descriptor with a
+       pointer to its bottom-left and pitch to be used in...
+       (gray_TWorker): ... here.
+       (gray_render_span): Move pixmap flow check from here...
+       (gray_raster_render): .. to here.
+
+2016-08-27  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [smooth] Reduce stack of band boundaries.
+
+       * src/smooth/ftgrays.c (gray_TBand): Removed.
+       (gray_convert_glyph): Updated to stack band boundaries concisely.
+
+2016-08-26  Werner Lemberg  <wl@gnu.org>
+
+       * src/cid/cidload.c (cid_face_open): Improve handling of `SDBytes'.
+
+2016-08-26  Werner Lemberg  <wl@gnu.org>
+
+       [cid] Fix commit from 2016-05-16.
+
+       * src/cid/cidparse.c (cid_parser_new): Fix off-by-one errors.
+
+2016-08-26  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Cache offset and size to bitmap data table.
+
+       This commit avoids `EBDT' and friends being looked up again and
+       again while loading a single embedded bitmap.
+
+       * include/freetype/internal/tttypes.h (TT_FaceRec)
+       [TT_CONFIG_OPTION_EMBEDDED_BITMAPS]: New fields `ebdt_start' and
+       `ebdt_size'.
+
+       * src/sfnt/ttsbit.c (tt_sbit_decoder_init): Move table lookup to ...
+       (tt_face_load_sbit): ... this function; also store the table size
+       and offset.
+
+2016-08-26  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       * src/smooth/ftgrays.c (gray_raster_render): Minor tweaks.
+
+2016-08-26  Werner Lemberg  <wl@gnu.org>
+
+       [type1] Fix heap buffer overflow.
+
+       Reported as
+
+         https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=36
+
+       * src/type1/t1load.c (parse_charstrings): Reject fonts that don't
+       contain glyph names.
+
+2016-08-25  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Fix previous commit (#48901).
+
+       * src/sfnt/ttcmap.c (tt_cmap4_char_map_binary): Thinkos.
+
+2016-08-25  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Speed up handling of invalid format 4 cmaps.
+
+       * src/sfnt/ttcmap.c (tt_cmap4_next, tt_cmap4_char_map_binary): Add
+       tests for `num_glyph' from `tt_cmap4_char_map_linear'.
+
+2016-08-25  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/internal/ftdriver.h: Remove unused typedefs.
+
+2016-08-22  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [smooth] Simplify span rendering.
+
+       This removes unnecessary complexity of span merging and buffering.
+       Instead, the spans are rendered as they come, speeding up the
+       rendering by about 5% as a result.
+
+       * src/smooth/ftgrays.c [FT_MAX_GRAY_SPANS]: Macro removed.
+       (gray_TWorker): Remove span buffer and related fields.
+       (gray_sweep, gray_hline): Updated.
+
+       * include/freetype/ftimage.h: Remove documentation note about
+       `FT_MAX_GRAY_SPANS', which was never in `ftoption.h' and is now gone.
+
+2016-08-16  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix `MPS' instruction.
+
+       According to Greg Hitchcock, MPS in DWrite really returns the point
+       size.
+
+       * src/truetype/ttobjs.h (TT_SizeRec): Add `point_size' member.
+
+       * src/truetype/ttdriver.c (tt_size_request): Set `point_size'.
+
+       * src/truetype/ttinterp.h (TT_ExecContextRec): Add `pointSize'
+       member.
+
+       * src/truetype/ttinterp.c (TT_Load_Context): Updated.
+       (Ins_MPS): Fix instruction.
+
+2016-08-16  Werner Lemberg  <wl@gnu.org>
+
+       [lzw] Optimize last commit.
+
+       * src/lzw/ftzopen.c (ft_lzwstate_get_code): Move check into
+       conditional clause.
+
+2016-08-16  Werner Lemberg  <wl@gnu.org>
+
+       [lzw] Avoid invalid left shift.
+
+       Reported as
+
+         https://bugzilla.mozilla.org/show_bug.cgi?id=1295366
+
+       * src/lzw/ftzopen.c (ft_lzwstate_get_code): Limit `num_bits'.
+
+2016-08-16  Werner Lemberg  <wl@gnu.org>
+
+       [lzw] Avoid buffer overrun.
+
+       Reported as
+
+         https://bugzilla.mozilla.org/show_bug.cgi?id=1273283
+
+       * src/lzw/ftzopen.c (ft_lzwstate_refill): Ensure `buf_size' doesn't
+       underflow.
+
+2016-08-16  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix compiler warning.
+
+       * src/truetype/ttgload.c (load_truetype_glyph): Add cast.
+
+2016-08-13  Werner Lemberg  <wl@gnu.org>
+
+       [winfonts] Avoid zero bitmap width and height.
+
+       Reported as
+
+         https://bugzilla.mozilla.org/show_bug.cgi?id=1272173
+
+       * src/winfonts/winfnt.c (FNT_Face_Init): Check zero pixel height.
+       (FNT_Load_Glyph): Check for zero pitch.
+
+2016-08-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       * src/truetype/ttinterp.c (Pop_Push_Count): Revert changes.
+
+2016-08-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       * src/truetype/ttinterp.c (TT_RunIns): Minor and formatting.
+
+2016-08-11  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       * src/truetype/ttinterp.c (Pop_Push_Count): Fix some entries.
+
+2016-08-10  Peter Klotz  <Peter.Klotz@ith-icoserve.com>
+
+       * src/smooth/ftgrays.c (gray_hline): Fix uninitialized access.
+
+2016-08-10  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Use correct type for `italicAngle' field (#48732).
+
+       * src/sfnt/ttload.c (tt_face_load_post): Fix types.
+
+2016-08-06  Jon Spencer  <jon@jonspencer.ca>
+
+       [sfnt] Fix `FT_Get_Advance' for bitmap strikes.
+
+       `FT_Get_Advance' returns 0 for bitmap fonts.  It first gets the
+       advance value from the font table and then scales it by the
+       `font->size->metrics->x_scale' field.  But `FT_Select_Size' doesn't
+       set that value for bitmap fonts and the advance gets scaled to zero.
+
+       Taken from
+
+         https://github.com/behdad/harfbuzz/issues/252
+
+       * src/sfnt/ttsbit.c (tt_face_load_strike_metrics)
+       <TT_SBIT_TABLE_TYPE_EBLC>: Set scale values.
+
+2016-08-06  Behdad Esfahbod  <behdad@behdad.org>
+
+       [truetype] Fix GX variation handling of composites.
+
+       * src/truetype/ttgload.c (load_truetype_glyph)
+       [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Check `ARGS_ARE_XY_VALUES' flag.
+
+2016-08-05  Alexei Podtelezhnikov  <apodtele@gmail.com>
+
+       [smooth] Minor refactoring.
+
+       * src/smooth/ftgrays.c (gray_render_scanline, gray_render_line):
+       Updated.
+
+2016-07-29  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt, truetype] Don't abort on invalid `maxComponentDepth'.
+
+       Since 2016-05-16 we detect infinite recursion directly.
+
+       * src/sfnt/ttload.c (tt_face_load_maxp): Don't adjust
+       `maxComponentDepth'.
+       * src/truetype/ttgload.c (load_truetype_glyph): Don't abort if
+       `maxComponentDepth' is not valid.  Instead, simply adjust its value
+       and emit a tracing message.
+
+2016-07-26  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/aflatin.c (af_latin_metrics_scale_dim): Minor.
+
+       No functional change.
+
+2016-07-22  Hin-Tak Leung  <htl10@users.sourceforge.net>
+
+       [truetype] Record the end of IDEFs.
+
+       To match the logic in FDEF.  The value of the end is only used for
+       bound-checking in `Ins_JMPR', so it may not have been obvious that
+       it was not recorded.  Tested (as part of Font Validator 2.0) all the
+       fonts on Fedora and did not see any change.
+
+       * src/truetype/ttinterp.c (Ins_IDEF): Updated.
+
+2016-07-19  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Sanitizer fix, second try.
+
+       * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Fix boundary
+       tests and use only one slot more.
+
+2016-07-19  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Sanitizer fix.
+
+       * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Increase array
+       to fix nested loops.
+
+2016-07-18  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Make GETDATA work only for GX fonts.
+
+       * src/truetype/ttinterp.c (opcode_name): Updated.
+       (Ins_GETDATA): Only define for `TT_CONFIG_OPTION_GX_VAR_SUPPORT'.
+       (TT_RunIns): Updated.
+
+2016-07-17  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Add support for Apple's
+
+         GETDATA[], opcode 0x92
+
+       bytecode instruction.  It always returns 17, and we have absolutely
+       no idea what it is good for...
+
+       * src/truetype/ttinterp.c (Pop_Push_Count, opcode_name): Updated.
+       (Ins_GETDATA): New function.
+       (TT_RunIns): Add it.
+
+2016-07-16  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Add bytecode support for GX variation fonts.
+
+       This commit implements undocumented (but confirmed) stuff from
+       Apple's old bytecode engine.
+
+         GETVARIATION[], opcode 0x91
+           This opcode pushes normalized variation coordinates for all axes
+           onto the stack (in 2.14 format).  Coordinate of first axis gets
+           pushed first.
+
+         GETINFO[], selector bit 3
+           If GX variation support is enabled, bit 10 of the result is set
+           to 1.
+
+       * src/truetype/ttinterp.c: Include FT_MULTIPLE_MASTERS_H.
+       (opcode_name) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Updated.
+       (Ins_GETINFO) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Handle selector
+       bit 3, checking support for variation glyph hinting.
+       (Ins_GETVARIATION) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: New function
+       to implement opcode 0x91.
+       (TT_RunIns) [TT_CONFIG_OPTION_GX_VAR_SUPPORT]: Handle opcode 0x91.
+
+2016-07-16  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix GETINFO bytecode instruction.
+
+       * src/truetype/ttinterp.c (Ins_GETINFO): Fix return value for
+       stretching information.
+
+2016-07-16  Behdad Esfahbod  <behdad@behdad.org>
+
+       [truetype] Make all glyphs in `Zycon' GX font work.
+
+       * src/truetype/ttgxvar.c (ft_var_readpackedpoints): Fix boundary
+       tests.
+
+2016-07-16  Werner Lemberg  <wl@gnu.org>
+
+       [truetype] Fix GX delta tracing.
+
+       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Trace
+       relative point movements.
+
+2016-07-16  Behdad Esfahbod  <behdad@behdad.org>
+
+       [truetype] More fixes for GX.
+
+       This finally fixes the rendering of the cyclist and the lizard in
+       the `Zycon' font.
+
+       * src/truetype/ttgxvar.c (ft_var_readpackedpoints): `first' point
+       index is always cumulative.
+
+       (tt_handle_deltas): Rename to...
+       (tt_interpolate_deltas): ... This.
+       Add new parameter for output point array.
+       Update caller.
+
+       (TT_Vary_Apply_Glyph_Deltas): Add `points_out' array; it now holds
+       the intermediate results of `tt_interpolate_deltas' that are to be
+       added to `outline->points'.
+
+2016-07-15  Werner Lemberg  <wl@gnu.org>
+
+       * src/autofit/aflatin.c (af_latin_hints_compute_segments): Thinko.
+
+       `max_pos' is always larger than `min_pos' so `FT_ABS' is not needed.
+
+       Reported by Alexei.
+
+2016-07-16  Nikolaus Waxweiler  <madigens@gmail.com>
+
+       * src/truetype/ttinterp.c (Ins_MIRP): Fix copy-and-paste error.
+
+       Problem reported by Hin-Tak Leung.
+
+2016-07-15  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] Update and improve segment and edge tracing.
+
+       * src/autofit/afhints.c (af_glyph_hints_dump_segments): Trace
+       `delta' also.
+       Don't show first point of segment as a replacement for `pos'; this
+       is (a) misleading, since the difference to `pos' can be almost
+       arbitrarily large in corner cases, and (b) it is better to have all
+       segment data in font units instead of a single value given in output
+       space coordinates.
+       Improve layout.
+       (af_glyph_hints_dump_edges): Show px->units and units->px conversion
+       values for convenience.
+       Improve layout.
+
+2016-07-15  Werner Lemberg  <wl@gnu.org>
+
+       [autofit] For edges, reject segments wider than 1px (#41334).
+
+       * src/autofit/afhints.h (AF_SegmentRec): New member `delta'.
+
+       * src/autofit/aflatin.c (af_latin_hints_compute_segments): Compute
+       `delta'.
+       (af_latin_hints_compute_edges): Reject segments with a delta larger
+       than 0.5px.
+
+2016-07-14  Werner Lemberg  <wl@gnu.org>
+
+       * include/freetype/freetype.h (FT_IS_NAMED_INSTANCE): New macro.
+
+2016-07-14  Werner Lemberg  <wl@gnu.org>
+
+       [sfnt] Fix `face_index' value in `FT_Face' for named instances.
+
+       * src/sfnt/sfobjs.c (sfnt_init_face): Don't strip off higher 16bits.
+
+2016-07-14  Werner Lemberg  <wl@gnu.org>
+
+       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Fix tracing.
+
+2016-07-14  Behdad Esfahbod  <behdad@behdad.org>
+
+       [truetype] Fix gxvar delta interpolation.
+
+       The coordinates of the base font should be used for interpolation
+       purposes, NOT the current points (i.e., the result of accumulation
+       of previous deltas).
+
+       * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Initialize
+       `points_org' before looping over all tuples.
+
+
+----------------------------------------------------------------------------
+
+Copyright 2016-2018 by
+David Turner, Robert Wilhelm, and Werner Lemberg.
+
+This file is part of the FreeType project, and may only be used, modified,
+and distributed under the terms of the FreeType project license,
+LICENSE.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
index 5df9b8f..a9eb396 100644 (file)
--- a/Jamfile
+++ b/Jamfile
@@ -1,6 +1,6 @@
 # FreeType 2 top Jamfile.
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -210,7 +210,7 @@ actions RefDoc
 {
   python $(FT2_SRC)/tools/docmaker/docmaker.py
          --prefix=ft2
-         --title=FreeType-2.8
+         --title=FreeType-2.9
          --output=$(DOC_DIR)
          $(FT2_INCLUDE)/freetype/*.h
          $(FT2_INCLUDE)/freetype/config/*.h
index 0047e53..bdd04bc 100644 (file)
--- a/Jamrules
+++ b/Jamrules
@@ -1,6 +1,6 @@
 # FreeType 2 JamRules.
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 1c41458..0c7ee0e 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
diff --git a/README b/README
index 926e9dc..1e7ea97 100644 (file)
--- a/README
+++ b/README
@@ -1,7 +1,7 @@
-  FreeType 2.8
+  FreeType 2.9
   ============
 
-  Homepage: http://www.freetype.org
+  Homepage: https://www.freetype.org
 
   FreeType is a freely available software library to render fonts.
 
   documentation is available as a separate package from our sites.  Go
   to
 
-    http://download.savannah.gnu.org/releases/freetype/
+    https://download.savannah.gnu.org/releases/freetype/
 
   and download one of the following files.
 
-    freetype-doc-2.8.tar.bz2
-    freetype-doc-2.8.tar.gz
-    ftdoc28.zip
+    freetype-doc-2.9.tar.bz2
+    freetype-doc-2.9.tar.gz
+    ftdoc29.zip
 
   To view the documentation online, go to
 
-    http://www.freetype.org/freetype2/documentation.html
+    https://www.freetype.org/freetype2/documentation.html
 
 
   Mailing Lists
@@ -46,7 +46,7 @@
 
   The lists are moderated; see
 
-    http://www.freetype.org/contact.html
+    https://www.freetype.org/contact.html
 
   how to subscribe.
 
@@ -71,7 +71,7 @@
 
 ----------------------------------------------------------------------
 
-Copyright 2006-2017 by
+Copyright 2006-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
index 06f778b..a3d7fc0 100644 (file)
@@ -37,7 +37,7 @@ repository.
 
 ----------------------------------------------------------------------
 
-Copyright 2005-2017 by
+Copyright 2005-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
index 31c1534..ab90e64 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-# Copyright 2005-2017 by
+# Copyright 2005-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index fb44116..29e97d6 100644 (file)
@@ -1,7 +1,7 @@
 
 README for the builds/amiga subdirectory.
 
-Copyright 2005-2017 by
+Copyright 2005-2018 by
 Werner Lemberg and Detlef Würkner.
 
 This file is part of the FreeType project, and may only be used, modified,
index 9434841..0217e0e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Amiga-specific configuration file (specification only).              */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  Werner Lemberg and Detlef Würkner.                                     */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 38ea4c9..f8baab5 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Amiga-specific FreeType module selection.                            */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  Werner Lemberg and Detlef Würkner.                                     */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index e467f9a..6367438 100644 (file)
@@ -5,7 +5,7 @@
 #
 
 
-# Copyright 2005-2017 by
+# Copyright 2005-2018 by
 # Werner Lemberg and Detlef Würkner.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 82ee864..c07e181 100644 (file)
@@ -4,7 +4,7 @@
 #
 
 
-# Copyright 2005-2017 by
+# Copyright 2005-2018 by
 # Werner Lemberg and Detlef Würkner.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 08e0a38..29a31e4 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2005-2017 by
+# Copyright 2005-2018 by
 # Werner Lemberg and Detlef Würkner.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 1a897cf..f3ba48c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Debugging and logging component for amiga (body).                    */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, Werner Lemberg and Detlef Würkner.       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index c3960d9..babaeeb 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Amiga-specific FreeType low-level system interface (body).           */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, Werner Lemberg and Detlef Würkner.       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index d3c0f28..1484f96 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index b33e8ce..c06732c 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index fa6f236..89c54dd 100644 (file)
@@ -5,7 +5,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 181efe4..619ceaf 100644 (file)
@@ -2,7 +2,7 @@
 # FreeType 2 configuration rules for a BeOS system
 #
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 30f6d10..82f6205 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 5717e6a..c6da70c 100644 (file)
@@ -1,6 +1,6 @@
 # iOS.cmake
 #
-# Copyright 2014-2017 by
+# Copyright 2014-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # Written by David Wimsey <david@wimsey.us>
index 34aded7..1fa3a18 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh -e
 
-# Copyright 2015-2017 by
+# Copyright 2015-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index d619641..99fe8cb 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 9b43fd1..8d67fa1 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 82e3829..02d4833 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index a25e4bc..2926b11 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2003-2017 by
+# Copyright 2003-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 8994fa2..48d2848 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 3465038..9c77239 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 287db44..e9236d3 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 560c61b..09fffeb 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 2aa4fbe..10299da 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index e86ecc5..74f498b 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 62a4811..e455922 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 91b429e..1356c1c 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 4ed478e..771fc31 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -131,6 +131,9 @@ std_setup:
 
 # Special case for Dos, Windows, OS/2, where echo "" doesn't work correctly!
 #
+# For `cmd.exe', we use 0xFF as a replacement character for a protected
+# space.
+#
 dos_setup:
        @type builds$(SEP)newline
        @echo $(PROJECT_TITLE) build system -- automatic system detection
@@ -146,7 +149,7 @@ dos_setup:
        @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 (this needs python >= 2.6).
+       @echo or 'make refdoc' to build the API reference (this needs at least python 2.6).
        @type builds$(SEP)newline
        @$(COPY) $(subst /,$(SEP),$(CONFIG_RULES) $(CONFIG_MK)) > nul
 
index 85c48df..55b0e76 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index a6c2f22..cb1154d 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 85de037..dedcc3f 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2003-2017 by
+# Copyright 2003-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index e38acfb..53099ab 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index ddb4876..1bd00e7 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2003-2017 by
+# Copyright 2003-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 10b79d3..59fe31a 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2005-2017 by
+# Copyright 2005-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index f8cfd41..f2e7e60 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -153,6 +153,9 @@ endif
 ifneq ($(wildcard $(OBJ_DIR)/ftoption.h),)
   FTOPTION_H    := $(OBJ_DIR)/ftoption.h
   FTOPTION_FLAG := $DFT_CONFIG_OPTIONS_H="<ftoption.h>"
+else ifneq ($(wildcard $(BUILD_DIR)/ftoption.h),)
+  FTOPTION_H    := $(BUILD_DIR)/ftoption.h
+  FTOPTION_FLAG := $DFT_CONFIG_OPTIONS_H="<ftoption.h>"
 endif
 
 # `CPPFLAGS' might be specified by the user in the environment.
index 3854e70..3b0e8da 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 4cc2dc9..8ba5e64 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 60cf73e..c45546c 100644 (file)
@@ -5,7 +5,7 @@
 /*    Mac FOND support.  Written by just@letterror.com.                    */
 /*  Heavily Fixed by mpsuzuki, George Williams and Sean McBride            */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.     */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -1423,7 +1423,7 @@ typedef short ResourceIndex;
   /*    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.   */
+  /* 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,
@@ -1481,7 +1481,7 @@ typedef short ResourceIndex;
   /*    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.   */
+  /* 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,
index a89d579..e1edb17 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 3ea68fb..2edb8d4 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 2fe6263..7ad1ffb 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 842a289..505a754 100644 (file)
@@ -5,7 +5,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 4cdffba..65026b1 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 8087202..9c6d8dc 100644 (file)
@@ -2,7 +2,7 @@
 // FreeType 2 project for the symbian platform
 //
 
-// Copyright 2008-2017 by
+// Copyright 2008-2018 by
 // David Turner, Robert Wilhelm, and Werner Lemberg.
 //
 // This file is part of the FreeType project, and may only be used, modified,
@@ -25,10 +25,14 @@ PRJ_EXPORTS
 ../../include/freetype/config/ftoption.h       config/ftoption.h
 ../../include/freetype/config/ftstdlib.h       config/ftstdlib.h
 ../../include/freetype/freetype.h              freetype.h
+../../include/freetype/ftadvanc.h              ftadvanc.h
+../../include/freetype/ftautoh.h               ftautoh.h
 ../../include/freetype/ftbbox.h                        ftbbox.h
 ../../include/freetype/ftbdf.h                 ftbdf.h
 ../../include/freetype/ftbitmap.h              ftbitmap.h
+../../include/freetype/ftbzip2.h               ftbzip2.h
 ../../include/freetype/ftcache.h               ftcache.h
+../../include/freetype/ftcffdrv.h              ftcffdrv.h
 ../../include/freetype/ftcid.h                 ftcid.h
 ../../include/freetype/fterrdef.h              fterrdef.h
 ../../include/freetype/fterrors.h              fterrors.h
@@ -37,7 +41,6 @@ PRJ_EXPORTS
 ../../include/freetype/ftglyph.h               ftglyph.h
 ../../include/freetype/ftgxval.h               ftgxval.h
 ../../include/freetype/ftgzip.h                        ftgzip.h
-../../include/freetype/ftbzip2.h               ftbzip2.h
 ../../include/freetype/ftimage.h               ftimage.h
 ../../include/freetype/ftincrem.h              ftincrem.h
 ../../include/freetype/ftlcdfil.h              ftlcdfil.h
@@ -49,6 +52,8 @@ PRJ_EXPORTS
 ../../include/freetype/ftmoderr.h              ftmoderr.h
 ../../include/freetype/ftotval.h               ftotval.h
 ../../include/freetype/ftoutln.h               ftoutln.h
+../../include/freetype/ftparams.h              ftparams.h
+../../include/freetype/ftpcfdrv.h              ftpcfdrv.h
 ../../include/freetype/ftpfr.h                 ftpfr.h
 ../../include/freetype/ftrender.h              ftrender.h
 ../../include/freetype/ftsizes.h               ftsizes.h
@@ -56,11 +61,12 @@ PRJ_EXPORTS
 ../../include/freetype/ftstroke.h              ftstroke.h
 ../../include/freetype/ftsynth.h               ftsynth.h
 ../../include/freetype/ftsystem.h              ftsystem.h
+../../include/freetype/ftt1drv.h               ftt1drv.h
 ../../include/freetype/fttrigon.h              fttrigon.h
+../../include/freetype/ftttdrv.h               ftttdrv.h
 ../../include/freetype/fttypes.h               fttypes.h
 ../../include/freetype/ftwinfnt.h              ftwinfnt.h
 ../../include/freetype/t1tables.h              t1tables.h
 ../../include/freetype/ttnameid.h              ttnameid.h
 ../../include/freetype/tttables.h              tttables.h
 ../../include/freetype/tttags.h                        tttags.h
-../../include/freetype/ttunpat.h               ttunpat.h
index 6fe7333..d3b95ef 100644 (file)
@@ -2,7 +2,7 @@
 // FreeType 2 makefile for the symbian platform
 //
 
-// Copyright 2008-2017 by
+// Copyright 2008-2018 by
 // David Turner, Robert Wilhelm, and Werner Lemberg.
 //
 // This file is part of the FreeType project, and may only be used, modified,
@@ -49,6 +49,10 @@ sourcepath ..\..\src\bdf
 
 source bdf.c
 
+sourcepath ..\..\src\bzip2
+
+source ftbzip2.c
+
 sourcepath ..\..\src\cache
 
 source ftcache.c
@@ -65,10 +69,6 @@ sourcepath ..\..\src\gzip
 
 source ftgzip.c
 
-sourcepath ..\..\src\bzip2
-
-source ftbzip2.c
-
 sourcepath ..\..\src\lzw
 
 source ftlzw.c
@@ -126,12 +126,12 @@ systeminclude             ..\..\include
 systeminclude          \epoc32\include\stdapis
 userinclude            ..\..\src\autofit
 userinclude            ..\..\src\bdf
+userinclude            ..\..\src\bzip2
 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
index 7b1d03b..f51ad16 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 69ed3e5..588fe82 100755 (executable)
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright 1992-2017 Free Software Foundation, Inc.
+#   Copyright 1992-2018 Free Software Foundation, Inc.
 
-timestamp='2017-03-05'
+timestamp='2018-01-01'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@ timestamp='2017-03-05'
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -27,7 +27,7 @@ timestamp='2017-03-05'
 # Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 #
 # Please send patches to <config-patches@gnu.org>.
 
@@ -39,7 +39,7 @@ Usage: $0 [OPTION]
 
 Output the configuration name of the system \`$me' is run on.
 
-Operation modes:
+Options:
   -h, --help         print this help, then exit
   -t, --time-stamp   print date of last modification, then exit
   -v, --version      print version number, then exit
@@ -50,7 +50,7 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright 1992-2017 Free Software Foundation, Inc.
+Copyright 1992-2018 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -244,6 +244,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
        echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
        exit ;;
+    *:MidnightBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-midnightbsd${UNAME_RELEASE}
+       exit ;;
     *:ekkoBSD:*:*)
        echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
        exit ;;
@@ -259,6 +262,12 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:Sortix:*:*)
        echo ${UNAME_MACHINE}-unknown-sortix
        exit ;;
+    *:Redox:*:*)
+       echo ${UNAME_MACHINE}-unknown-redox
+       exit ;;
+    mips:OSF1:*.*)
+        echo mips-dec-osf1
+        exit ;;
     alpha:OSF1:*:*)
        case $UNAME_RELEASE in
        *4.0)
@@ -315,15 +324,6 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
        exitcode=$?
        trap '' 0
        exit $exitcode ;;
-    Alpha\ *:Windows_NT*:*)
-       # How do we know it's Interix rather than the generic POSIX subsystem?
-       # Should we change UNAME_MACHINE based on the output of uname instead
-       # of the specific Alpha model?
-       echo alpha-pc-interix
-       exit ;;
-    21064:Windows_NT:50:3)
-       echo alpha-dec-winnt3.5
-       exit ;;
     Amiga*:UNIX_System_V:4.0:*)
        echo m68k-unknown-sysv4
        exit ;;
@@ -485,13 +485,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 #endif
        #if defined (host_mips) && defined (MIPSEB)
        #if defined (SYSTYPE_SYSV)
-         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+         printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
        #endif
        #if defined (SYSTYPE_SVR4)
-         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+         printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
        #endif
        #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+         printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
        #endif
        #endif
          exit (-1);
@@ -614,7 +614,7 @@ EOF
     *:AIX:*:*)
        echo rs6000-ibm-aix
        exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
        echo romp-ibm-bsd4.4
        exit ;;
     ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
@@ -635,8 +635,8 @@ EOF
     9000/[34678]??:HP-UX:*:*)
        HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
        case "${UNAME_MACHINE}" in
-           9000/31? )            HP_ARCH=m68000 ;;
-           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/31?)            HP_ARCH=m68000 ;;
+           9000/[34]??)         HP_ARCH=m68k ;;
            9000/[678][0-9][0-9])
                if [ -x /usr/bin/getconf ]; then
                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
@@ -749,7 +749,7 @@ EOF
                { echo "$SYSTEM_NAME"; exit; }
        echo unknown-hitachi-hiuxwe2
        exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
        echo hppa1.1-hp-bsd
        exit ;;
     9000/8??:4.3bsd:*:*)
@@ -758,7 +758,7 @@ EOF
     *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
        echo hppa1.0-hp-mpeix
        exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
        echo hppa1.1-hp-osf
        exit ;;
     hp8??:OSF1:*:*)
@@ -855,10 +855,6 @@ EOF
     *:MSYS*:*)
        echo ${UNAME_MACHINE}-pc-msys
        exit ;;
-    i*:windows32*:*)
-       # uname -m includes "-pc" on this system.
-       echo ${UNAME_MACHINE}-mingw32
-       exit ;;
     i*:PW*:*)
        echo ${UNAME_MACHINE}-pc-pw32
        exit ;;
@@ -874,27 +870,12 @@ EOF
                echo ia64-unknown-interix${UNAME_RELEASE}
                exit ;;
        esac ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-       echo i${UNAME_MACHINE}-pc-mks
-       exit ;;
-    8664:Windows_NT:*)
-       echo x86_64-pc-mks
-       exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-       # How do we know it's Interix rather than the generic POSIX subsystem?
-       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-       # UNAME_MACHINE based on the output of uname instead of i386?
-       echo i586-pc-interix
-       exit ;;
     i*:UWIN*:*)
        echo ${UNAME_MACHINE}-pc-uwin
        exit ;;
     amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
        echo x86_64-unknown-cygwin
        exit ;;
-    p*:CYGWIN*:*)
-       echo powerpcle-unknown-cygwin
-       exit ;;
     prep*:SunOS:5.*:*)
        echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
        exit ;;
@@ -1097,7 +1078,7 @@ EOF
     i*86:*DOS:*:*)
        echo ${UNAME_MACHINE}-pc-msdosdjgpp
        exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+    i*86:*:4.*:*)
        UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
        if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
                echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
@@ -1304,14 +1285,21 @@ EOF
        if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
            if [ "$CC_FOR_BUILD" != no_compiler_found ]; then
                if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-                   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
-                   grep IS_64BIT_ARCH >/dev/null
+                      (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+                      grep IS_64BIT_ARCH >/dev/null
                then
                    case $UNAME_PROCESSOR in
                        i386) UNAME_PROCESSOR=x86_64 ;;
                        powerpc) UNAME_PROCESSOR=powerpc64 ;;
                    esac
                fi
+               # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+               if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+                      (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+                      grep IS_PPC >/dev/null
+               then
+                   UNAME_PROCESSOR=powerpc
+               fi
            fi
        elif test "$UNAME_PROCESSOR" = i386 ; then
            # Avoid executing cc on OS X 10.9, as it ships with a stub
@@ -1335,16 +1323,16 @@ EOF
     *:QNX:*:4*)
        echo i386-pc-qnx
        exit ;;
-    NEO-?:NONSTOP_KERNEL:*:*)
+    NEO-*:NONSTOP_KERNEL:*:*)
        echo neo-tandem-nsk${UNAME_RELEASE}
        exit ;;
     NSE-*:NONSTOP_KERNEL:*:*)
        echo nse-tandem-nsk${UNAME_RELEASE}
        exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
+    NSR-*:NONSTOP_KERNEL:*:*)
        echo nsr-tandem-nsk${UNAME_RELEASE}
        exit ;;
-    NSX-?:NONSTOP_KERNEL:*:*)
+    NSX-*:NONSTOP_KERNEL:*:*)
        echo nsx-tandem-nsk${UNAME_RELEASE}
        exit ;;
     *:NonStop-UX:*:*)
@@ -1418,16 +1406,28 @@ EOF
        exit ;;
 esac
 
+echo "$0: unable to guess system type" >&2
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}" in
+    mips:Linux | mips64:Linux)
+       # If we got here on MIPS GNU/Linux, output extra information.
+       cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+       ;;
+esac
+
 cat >&2 <<EOF
-$0: unable to guess system type
 
 This script (version $timestamp), has failed to recognize the
-operating system you are using. If your script is old, overwrite
-config.guess and config.sub with the latest versions from:
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
 
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
+  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess
 and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+  https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 If $0 has already been updated, send the following data and any
 information you think might be pertinent to config-patches@gnu.org to
@@ -1459,7 +1459,7 @@ EOF
 exit 1
 
 # Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
+# eval: (add-hook 'write-file-functions 'time-stamp)
 # time-stamp-start: "timestamp='"
 # time-stamp-format: "%:y-%02m-%02d"
 # time-stamp-end: "'"
index 40ea5df..f2632cd 100755 (executable)
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2017 Free Software Foundation, Inc.
+#   Copyright 1992-2018 Free Software Foundation, Inc.
 
-timestamp='2017-04-02'
+timestamp='2018-01-01'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -15,7 +15,7 @@ timestamp='2017-04-02'
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -33,7 +33,7 @@ timestamp='2017-04-02'
 # Otherwise, we print the canonical config type on stdout and succeed.
 
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
+# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub
 
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
@@ -57,7 +57,7 @@ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
 
 Canonicalize a configuration name.
 
-Operation modes:
+Options:
   -h, --help         print this help, then exit
   -t, --time-stamp   print date of last modification, then exit
   -v, --version      print version number, then exit
@@ -67,7 +67,7 @@ Report bugs and patches to <config-patches@gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright 1992-2017 Free Software Foundation, Inc.
+Copyright 1992-2018 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -229,9 +229,6 @@ case $os in
        -ptx*)
                basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
                ;;
-       -windowsnt*)
-               os=`echo $os | sed -e 's/windowsnt/winnt/'`
-               ;;
        -psos*)
                os=-psos
                ;;
@@ -316,7 +313,6 @@ case $basic_machine in
        | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
        | visium \
        | wasm32 \
-       | we32k \
        | x86 | xc16x | xstormy16 | xtensa \
        | z8k | z80)
                basic_machine=$basic_machine-unknown
@@ -643,7 +639,7 @@ case $basic_machine in
                basic_machine=rs6000-bull
                os=-bosx
                ;;
-       dpx2* | dpx2*-bull)
+       dpx2*)
                basic_machine=m68k-bull
                os=-sysv3
                ;;
@@ -905,7 +901,7 @@ case $basic_machine in
                basic_machine=v70-nec
                os=-sysv
                ;;
-       next | m*-next )
+       next | m*-next)
                basic_machine=m68k-next
                case $os in
                    -nextstep* )
@@ -1259,6 +1255,9 @@ case $basic_machine in
                basic_machine=hppa1.1-winbond
                os=-proelf
                ;;
+       x64)
+               basic_machine=x86_64-pc
+               ;;
        xbox)
                basic_machine=i686-pc
                os=-mingw32
@@ -1366,8 +1365,8 @@ esac
 if [ x"$os" != x"" ]
 then
 case $os in
-       # First match some system type aliases
-       # that might get confused with valid system types.
+       # First match some system type aliases that might get confused
+       # with valid system types.
        # -solaris* is a basic system type, with this one exception.
        -auroraux)
                os=-auroraux
@@ -1387,9 +1386,9 @@ case $os in
        -gnu/linux*)
                os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
                ;;
-       # First accept the basic system types.
+       # Now accept the basic system types.
        # The portable systems comes first.
-       # Each alternative MUST END IN A *, to match a version number.
+       # Each alternative MUST end in a * to match a version number.
        # -sysv* is not here because it comes later, after sysvr4.
        -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
              | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
@@ -1417,7 +1416,7 @@ case $os in
              | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
              | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
              | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \
-             | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*)
+             | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme*)
        # Remember, each alternative MUST END IN *, to match a version number.
                ;;
        -qnx*)
@@ -1492,7 +1491,7 @@ case $os in
        -nova*)
                os=-rtmk-nova
                ;;
-       -ns2 )
+       -ns2)
                os=-nextstep2
                ;;
        -nsk*)
@@ -1547,6 +1546,19 @@ case $os in
        -dicos*)
                os=-dicos
                ;;
+       -pikeos*)
+               # Until real need of OS specific support for
+               # particular features comes up, bare metal
+               # configurations are quite functional.
+               case $basic_machine in
+                   arm*)
+                       os=-eabi
+                       ;;
+                   *)
+                       os=-elf
+                       ;;
+               esac
+               ;;
        -nacl*)
                ;;
        -ios)
@@ -1694,7 +1706,7 @@ case $basic_machine in
        m88k-omron*)
                os=-luna
                ;;
-       *-next )
+       *-next)
                os=-nextstep
                ;;
        *-sequent)
@@ -1829,7 +1841,7 @@ echo $basic_machine$os
 exit
 
 # Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
+# eval: (add-hook 'write-file-functions 'time-stamp)
 # time-stamp-start: "timestamp='"
 # time-stamp-format: "%:y-%02m-%02d"
 # time-stamp-end: "'"
index a4c66eb..97a01e5 100755 (executable)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for FreeType 2.8.
+# Generated by GNU Autoconf 2.69 for FreeType 2.9.
 #
 # Report bugs to <freetype@nongnu.org>.
 #
@@ -590,8 +590,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='FreeType'
 PACKAGE_TARNAME='freetype'
-PACKAGE_VERSION='2.8'
-PACKAGE_STRING='FreeType 2.8'
+PACKAGE_VERSION='2.9'
+PACKAGE_STRING='FreeType 2.9'
 PACKAGE_BUGREPORT='freetype@nongnu.org'
 PACKAGE_URL=''
 
@@ -642,6 +642,7 @@ LIBSSTATIC_CONFIG
 LIBS_PRIVATE
 REQUIRES_PRIVATE
 ftmac_c
+LIB_CLOCK_GETTIME
 HARFBUZZ_LIBS
 HARFBUZZ_CFLAGS
 LIBPNG_LIBS
@@ -1329,7 +1330,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures FreeType 2.8 to adapt to many kinds of systems.
+\`configure' configures FreeType 2.9 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1394,7 +1395,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of FreeType 2.8:";;
+     short | recursive ) echo "Configuration of FreeType 2.9:";;
    esac
   cat <<\_ACEOF
 
@@ -1541,7 +1542,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-FreeType configure 2.8
+FreeType configure 2.9
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2139,7 +2140,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by FreeType $as_me 2.8, which was
+It was created by FreeType $as_me 2.9, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2495,7 +2496,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 # Don't forget to update `docs/VERSIONS.TXT'!
 
-version_info='20:0:14'
+version_info='22:0:16'
 
 ft_version=`echo $version_info | tr : .`
 
@@ -12566,15 +12567,13 @@ $as_echo "#define HAVE_LONG_LONG_INT 1" >>confdefs.h
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cpp computation of bit length in ftconfig.in works" >&5
 $as_echo_n "checking whether cpp computation of bit length in ftconfig.in works... " >&6; }
 orig_CPPFLAGS="${CPPFLAGS}"
-CPPFLAGS="-I${srcdir} -I. ${CPPFLAGS}"
+CPPFLAGS="-I${srcdir} -I. -I${srcdir}/../../include/freetype/config ${CPPFLAGS}"
 
 ac_clean_files=
-for f in ft2build.h ftoption.h ftstdlib.h; do
-  if test ! -f $f; then
-    ac_clean_files="$ac_clean_files $f"
-    touch $f
-  fi
-done
+if test ! -f ft2build.h; then
+  ac_clean_files=ft2build.h
+  touch ft2build.h
+fi
 
 cat > conftest.c <<\_ACEOF
 #include <limits.h>
@@ -13193,8 +13192,8 @@ main ()
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok, add it to XX_ANSIFLAGS" >&5
-$as_echo "ok, add it to XX_ANSIFLAGS" >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok, adding to XX_ANSIFLAGS" >&5
+$as_echo "ok, adding to XX_ANSIFLAGS" >&6; }
          XX_ANSIFLAGS="${XX_ANSIFLAGS} ${a}"
 
 else
@@ -13839,6 +13838,74 @@ if test x"$with_harfbuzz" = xyes -a "$have_harfbuzz" = no; then
 fi
 
 
+# check for librt
+#
+# We need `clock_gettime' for the `ftbench' demo program.
+#
+# The code is modeled after gnulib's file `clock_time.m4', ignoring
+# very old Solaris systems.
+
+LIB_CLOCK_GETTIME=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
+$as_echo_n "checking for library containing clock_gettime... " >&6; }
+if ${ac_cv_search_clock_gettime+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_func_search_save_LIBS=$LIBS
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char clock_gettime ();
+int
+main ()
+{
+return clock_gettime ();
+  ;
+  return 0;
+}
+_ACEOF
+for ac_lib in '' rt; do
+  if test -z "$ac_lib"; then
+    ac_res="none required"
+  else
+    ac_res=-l$ac_lib
+    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
+  fi
+  if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_search_clock_gettime=$ac_res
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext
+  if ${ac_cv_search_clock_gettime+:} false; then :
+  break
+fi
+done
+if ${ac_cv_search_clock_gettime+:} false; then :
+
+else
+  ac_cv_search_clock_gettime=no
+fi
+rm conftest.$ac_ext
+LIBS=$ac_func_search_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
+$as_echo "$ac_cv_search_clock_gettime" >&6; }
+ac_res=$ac_cv_search_clock_gettime
+if test "$ac_res" != no; then :
+  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
+  test "$ac_cv_search_clock_gettime" = "none required" \
+                || LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime
+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.
@@ -14472,27 +14539,60 @@ LIBSSTATIC_CONFIG=`echo "$LIBSSTATIC_CONFIG"          \
 # changing LDFLAGS value should only be done after
 # lt_cv_prog_compiler_static_works test
 
+ftoption_set()
+{
+  regexp="-e \\\"s|.*#.*def.*$1.*|#define $1|\\\""
+  FTOPTION_H_SED="$FTOPTION_H_SED $regexp"
+}
+
+ftoption_unset()
+{
+  regexp="-e \\\"s|.*#.*def.*$1.*|/* #undef $1 */|\\\""
+  FTOPTION_H_SED="$FTOPTION_H_SED $regexp"
+}
+
 if test "$have_zlib" != no; then
-  CFLAGS="$CFLAGS $ZLIB_CFLAGS -DFT_CONFIG_OPTION_SYSTEM_ZLIB"
+  CFLAGS="$CFLAGS $ZLIB_CFLAGS"
   LDFLAGS="$LDFLAGS $ZLIB_LIBS"
+  ftoption_set FT_CONFIG_OPTION_SYSTEM_ZLIB
+else
+  ftoption_unset FT_CONFIG_OPTION_SYSTEM_ZLIB
 fi
-
 if test "$have_bzip2" != no; then
-  CFLAGS="$CFLAGS $BZIP2_CFLAGS -DFT_CONFIG_OPTION_USE_BZIP2"
+  CFLAGS="$CFLAGS $BZIP2_CFLAGS"
   LDFLAGS="$LDFLAGS $BZIP2_LIBS"
+  ftoption_set FT_CONFIG_OPTION_USE_BZIP2
+else
+  ftoption_unset FT_CONFIG_OPTION_USE_BZIP2
 fi
 if test "$have_libpng" != no; then
-  CFLAGS="$CFLAGS $LIBPNG_CFLAGS -DFT_CONFIG_OPTION_USE_PNG"
+  CFLAGS="$CFLAGS $LIBPNG_CFLAGS"
   LDFLAGS="$LDFLAGS $LIBPNG_LIBS"
+  ftoption_set FT_CONFIG_OPTION_USE_PNG
+else
+  ftoption_unset FT_CONFIG_OPTION_USE_PNG
 fi
 if test "$have_harfbuzz" != no; then
-  CFLAGS="$CFLAGS $HARFBUZZ_CFLAGS -DFT_CONFIG_OPTION_USE_HARFBUZZ"
+  CFLAGS="$CFLAGS $HARFBUZZ_CFLAGS"
   LDFLAGS="$LDFLAGS $HARFBUZZ_LIBS"
+  ftoption_set FT_CONFIG_OPTION_USE_HARFBUZZ
+else
+  ftoption_unset FT_CONFIG_OPTION_USE_HARFBUZZ
 fi
 
 
 
 
+# We don't want to use a template file for `ftoption.h', since compilation
+# should work without calling a configure script also.  For this reason, we
+# copy the `include/freetype/config/ftoption.h' file to the `unix/builds'
+# directory (using a dummy `AC_CONFIG_FILES' call) and apply the just
+# constructed $FTOPTION_H_SED regexp (using the post-action of
+# `AC_CONFIG_FILES'); this is also the version that gets installed later on.
+#
+ac_config_files="$ac_config_files ftoption.h:${srcdir}/../../include/freetype/config/ftoption.h"
+
+
 # configuration file -- stay in 8.3 limit
 #
 # since #undef doesn't survive in configuration header files we replace
@@ -15017,7 +15117,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by FreeType $as_me 2.8, which was
+This file was extended by FreeType $as_me 2.9, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -15083,7 +15183,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-FreeType config.status 2.8
+FreeType config.status 2.9
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -15487,6 +15587,7 @@ fi
 
 
 
+FTOPTION_H_SED="$FTOPTION_H_SED"
 
 _ACEOF
 
@@ -15497,6 +15598,7 @@ for ac_config_target in $ac_config_targets
 do
   case $ac_config_target in
     "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "ftoption.h") CONFIG_FILES="$CONFIG_FILES ftoption.h:${srcdir}/../../include/freetype/config/ftoption.h" ;;
     "ftconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS ftconfig.h:ftconfig.in" ;;
     "unix-cc.mk") CONFIG_FILES="$CONFIG_FILES unix-cc.mk:unix-cc.in" ;;
     "unix-def.mk") CONFIG_FILES="$CONFIG_FILES unix-def.mk:unix-def.in" ;;
@@ -16607,6 +16709,9 @@ ltmain=$ac_aux_dir/ltmain.sh
   chmod +x "$ofile"
 
  ;;
+    "ftoption.h":F) mv ftoption.h ftoption.tmp
+   eval "sed $FTOPTION_H_SED < ftoption.tmp > ftoption.h"
+   rm ftoption.tmp ;;
     "ftconfig.h":H) mv ftconfig.h ftconfig.tmp
    sed 's|/undef|#undef|' < ftconfig.tmp > ftconfig.h
    rm ftconfig.tmp ;;
index 7cdafcc..b980278 100644 (file)
@@ -2,7 +2,7 @@
 #
 # Process this file with autoconf to produce a configure script.
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
 # indicate that you have read the license and understand and accept it
 # fully.
 
-AC_INIT([FreeType], [2.8], [freetype@nongnu.org], [freetype])
+AC_INIT([FreeType], [2.9], [freetype@nongnu.org], [freetype])
 AC_CONFIG_SRCDIR([ftconfig.in])
 
 
 # Don't forget to update `docs/VERSIONS.TXT'!
 
-version_info='20:0:14'
+version_info='22:0:16'
 AC_SUBST([version_info])
 ft_version=`echo $version_info | tr : .`
 AC_SUBST([ft_version])
@@ -112,15 +112,13 @@ AC_TYPE_LONG_LONG_INT
 
 AC_MSG_CHECKING([whether cpp computation of bit length in ftconfig.in works])
 orig_CPPFLAGS="${CPPFLAGS}"
-CPPFLAGS="-I${srcdir} -I. ${CPPFLAGS}"
+CPPFLAGS="-I${srcdir} -I. -I${srcdir}/../../include/freetype/config ${CPPFLAGS}"
 
 ac_clean_files=
-for f in ft2build.h ftoption.h ftstdlib.h; do
-  if test ! -f $f; then
-    ac_clean_files="$ac_clean_files $f"
-    touch $f
-  fi
-done
+if test ! -f ft2build.h; then
+  ac_clean_files=ft2build.h
+  touch ft2build.h
+fi
 
 cat > conftest.c <<\_ACEOF
 #include <limits.h>
@@ -275,7 +273,7 @@ if test "x$GCC" = xyes; then
             }
 
           ])],
-        [AC_MSG_RESULT([ok, add it to XX_ANSIFLAGS])
+        [AC_MSG_RESULT([ok, adding to XX_ANSIFLAGS])
          XX_ANSIFLAGS="${XX_ANSIFLAGS} ${a}"
         ],
         [AC_MSG_RESULT([no])])
@@ -511,6 +509,21 @@ if test x"$with_harfbuzz" = xyes -a "$have_harfbuzz" = no; then
 fi
 
 
+# check for librt
+#
+# We need `clock_gettime' for the `ftbench' demo program.
+#
+# The code is modeled after gnulib's file `clock_time.m4', ignoring
+# very old Solaris systems.
+
+LIB_CLOCK_GETTIME=
+AC_SEARCH_LIBS([clock_gettime],
+               [rt],
+               [test "$ac_cv_search_clock_gettime" = "none required" \
+                || LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime])
+AC_SUBST([LIB_CLOCK_GETTIME])
+
+
 # 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.
@@ -977,27 +990,63 @@ AC_SUBST([build_libtool_libs])
 # changing LDFLAGS value should only be done after
 # lt_cv_prog_compiler_static_works test
 
+ftoption_set()
+{
+  regexp="-e \\\"s|.*#.*def.*$1.*|#define $1|\\\""
+  FTOPTION_H_SED="$FTOPTION_H_SED $regexp"
+}
+
+ftoption_unset()
+{
+  regexp="-e \\\"s|.*#.*def.*$1.*|/* #undef $1 */|\\\""
+  FTOPTION_H_SED="$FTOPTION_H_SED $regexp"
+}
+
 if test "$have_zlib" != no; then
-  CFLAGS="$CFLAGS $ZLIB_CFLAGS -DFT_CONFIG_OPTION_SYSTEM_ZLIB"
+  CFLAGS="$CFLAGS $ZLIB_CFLAGS"
   LDFLAGS="$LDFLAGS $ZLIB_LIBS"
+  ftoption_set FT_CONFIG_OPTION_SYSTEM_ZLIB
+else
+  ftoption_unset FT_CONFIG_OPTION_SYSTEM_ZLIB
 fi
-
 if test "$have_bzip2" != no; then
-  CFLAGS="$CFLAGS $BZIP2_CFLAGS -DFT_CONFIG_OPTION_USE_BZIP2"
+  CFLAGS="$CFLAGS $BZIP2_CFLAGS"
   LDFLAGS="$LDFLAGS $BZIP2_LIBS"
+  ftoption_set FT_CONFIG_OPTION_USE_BZIP2
+else
+  ftoption_unset FT_CONFIG_OPTION_USE_BZIP2
 fi
 if test "$have_libpng" != no; then
-  CFLAGS="$CFLAGS $LIBPNG_CFLAGS -DFT_CONFIG_OPTION_USE_PNG"
+  CFLAGS="$CFLAGS $LIBPNG_CFLAGS"
   LDFLAGS="$LDFLAGS $LIBPNG_LIBS"
+  ftoption_set FT_CONFIG_OPTION_USE_PNG
+else
+  ftoption_unset FT_CONFIG_OPTION_USE_PNG
 fi
 if test "$have_harfbuzz" != no; then
-  CFLAGS="$CFLAGS $HARFBUZZ_CFLAGS -DFT_CONFIG_OPTION_USE_HARFBUZZ"
+  CFLAGS="$CFLAGS $HARFBUZZ_CFLAGS"
   LDFLAGS="$LDFLAGS $HARFBUZZ_LIBS"
+  ftoption_set FT_CONFIG_OPTION_USE_HARFBUZZ
+else
+  ftoption_unset FT_CONFIG_OPTION_USE_HARFBUZZ
 fi
 
 AC_SUBST([CFLAGS])
 AC_SUBST([LDFLAGS])
 
+# We don't want to use a template file for `ftoption.h', since compilation
+# should work without calling a configure script also.  For this reason, we
+# copy the `include/freetype/config/ftoption.h' file to the `unix/builds'
+# directory (using a dummy `AC_CONFIG_FILES' call) and apply the just
+# constructed $FTOPTION_H_SED regexp (using the post-action of
+# `AC_CONFIG_FILES'); this is also the version that gets installed later on.
+#
+AC_CONFIG_FILES([ftoption.h:${srcdir}/../../include/freetype/config/ftoption.h],
+  [mv ftoption.h ftoption.tmp
+   eval "sed $FTOPTION_H_SED < ftoption.tmp > ftoption.h"
+   rm ftoption.tmp],
+  [FTOPTION_H_SED="$FTOPTION_H_SED"])
+
 # configuration file -- stay in 8.3 limit
 #
 # since #undef doesn't survive in configuration header files we replace
index ef6debe..20157b9 100644 (file)
@@ -2,7 +2,7 @@
 #
 # Process this file with autoconf to produce a configure script.
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -17,7 +17,7 @@ AC_CONFIG_SRCDIR([ftconfig.in])
 
 # Don't forget to update `docs/VERSIONS.TXT'!
 
-version_info='20:0:14'
+version_info='22:0:16'
 AC_SUBST([version_info])
 ft_version=`echo $version_info | tr : .`
 AC_SUBST([ft_version])
@@ -112,15 +112,13 @@ AC_TYPE_LONG_LONG_INT
 
 AC_MSG_CHECKING([whether cpp computation of bit length in ftconfig.in works])
 orig_CPPFLAGS="${CPPFLAGS}"
-CPPFLAGS="-I${srcdir} -I. ${CPPFLAGS}"
+CPPFLAGS="-I${srcdir} -I. -I${srcdir}/../../include/freetype/config ${CPPFLAGS}"
 
 ac_clean_files=
-for f in ft2build.h ftoption.h ftstdlib.h; do
-  if test ! -f $f; then
-    ac_clean_files="$ac_clean_files $f"
-    touch $f
-  fi
-done
+if test ! -f ft2build.h; then
+  ac_clean_files=ft2build.h
+  touch ft2build.h
+fi
 
 cat > conftest.c <<\_ACEOF
 #include <limits.h>
@@ -275,7 +273,7 @@ if test "x$GCC" = xyes; then
             }
 
           ])],
-        [AC_MSG_RESULT([ok, add it to XX_ANSIFLAGS])
+        [AC_MSG_RESULT([ok, adding to XX_ANSIFLAGS])
          XX_ANSIFLAGS="${XX_ANSIFLAGS} ${a}"
         ],
         [AC_MSG_RESULT([no])])
@@ -511,6 +509,21 @@ if test x"$with_harfbuzz" = xyes -a "$have_harfbuzz" = no; then
 fi
 
 
+# check for librt
+#
+# We need `clock_gettime' for the `ftbench' demo program.
+#
+# The code is modeled after gnulib's file `clock_time.m4', ignoring
+# very old Solaris systems.
+
+LIB_CLOCK_GETTIME=
+AC_SEARCH_LIBS([clock_gettime],
+               [rt],
+               [test "$ac_cv_search_clock_gettime" = "none required" \
+                || LIB_CLOCK_GETTIME=$ac_cv_search_clock_gettime])
+AC_SUBST([LIB_CLOCK_GETTIME])
+
+
 # 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.
@@ -977,27 +990,63 @@ AC_SUBST([build_libtool_libs])
 # changing LDFLAGS value should only be done after
 # lt_cv_prog_compiler_static_works test
 
+ftoption_set()
+{
+  regexp="-e \\\"s|.*#.*def.*$1.*|#define $1|\\\""
+  FTOPTION_H_SED="$FTOPTION_H_SED $regexp"
+}
+
+ftoption_unset()
+{
+  regexp="-e \\\"s|.*#.*def.*$1.*|/* #undef $1 */|\\\""
+  FTOPTION_H_SED="$FTOPTION_H_SED $regexp"
+}
+
 if test "$have_zlib" != no; then
-  CFLAGS="$CFLAGS $ZLIB_CFLAGS -DFT_CONFIG_OPTION_SYSTEM_ZLIB"
+  CFLAGS="$CFLAGS $ZLIB_CFLAGS"
   LDFLAGS="$LDFLAGS $ZLIB_LIBS"
+  ftoption_set FT_CONFIG_OPTION_SYSTEM_ZLIB
+else
+  ftoption_unset FT_CONFIG_OPTION_SYSTEM_ZLIB
 fi
-
 if test "$have_bzip2" != no; then
-  CFLAGS="$CFLAGS $BZIP2_CFLAGS -DFT_CONFIG_OPTION_USE_BZIP2"
+  CFLAGS="$CFLAGS $BZIP2_CFLAGS"
   LDFLAGS="$LDFLAGS $BZIP2_LIBS"
+  ftoption_set FT_CONFIG_OPTION_USE_BZIP2
+else
+  ftoption_unset FT_CONFIG_OPTION_USE_BZIP2
 fi
 if test "$have_libpng" != no; then
-  CFLAGS="$CFLAGS $LIBPNG_CFLAGS -DFT_CONFIG_OPTION_USE_PNG"
+  CFLAGS="$CFLAGS $LIBPNG_CFLAGS"
   LDFLAGS="$LDFLAGS $LIBPNG_LIBS"
+  ftoption_set FT_CONFIG_OPTION_USE_PNG
+else
+  ftoption_unset FT_CONFIG_OPTION_USE_PNG
 fi
 if test "$have_harfbuzz" != no; then
-  CFLAGS="$CFLAGS $HARFBUZZ_CFLAGS -DFT_CONFIG_OPTION_USE_HARFBUZZ"
+  CFLAGS="$CFLAGS $HARFBUZZ_CFLAGS"
   LDFLAGS="$LDFLAGS $HARFBUZZ_LIBS"
+  ftoption_set FT_CONFIG_OPTION_USE_HARFBUZZ
+else
+  ftoption_unset FT_CONFIG_OPTION_USE_HARFBUZZ
 fi
 
 AC_SUBST([CFLAGS])
 AC_SUBST([LDFLAGS])
 
+# We don't want to use a template file for `ftoption.h', since compilation
+# should work without calling a configure script also.  For this reason, we
+# copy the `include/freetype/config/ftoption.h' file to the `unix/builds'
+# directory (using a dummy `AC_CONFIG_FILES' call) and apply the just
+# constructed $FTOPTION_H_SED regexp (using the post-action of
+# `AC_CONFIG_FILES'); this is also the version that gets installed later on.
+#
+AC_CONFIG_FILES([ftoption.h:${srcdir}/../../include/freetype/config/ftoption.h],
+  [mv ftoption.h ftoption.tmp
+   eval "sed $FTOPTION_H_SED < ftoption.tmp > ftoption.h"
+   rm ftoption.tmp],
+  [FTOPTION_H_SED="$FTOPTION_H_SED"])
+
 # configuration file -- stay in 8.3 limit
 #
 # since #undef doesn't survive in configuration header files we replace
index a2cf0a7..54daa07 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 97de134..2d5b90d 100644 (file)
@@ -1,6 +1,6 @@
 #! /bin/sh
 #
-# Copyright 2000-2017 by
+# Copyright 2000-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -14,7 +14,7 @@ export LC_ALL
 
 
 # if `pkg-config' is available, use values from `freetype2.pc'
-pkg-config --version >/dev/null 2>&1
+%PKG_CONFIG% --atleast-pkgconfig-version 0.24 >/dev/null 2>&1
 if test $? -eq 0 ; then
   # note that option `--variable' is not affected by the
   # PKG_CONFIG_SYSROOT_DIR environment variable
@@ -23,17 +23,17 @@ if test $? -eq 0 ; then
     export PKG_CONFIG_SYSROOT_DIR
   fi
 
-  prefix=`pkg-config --variable prefix freetype2`
-  exec_prefix=`pkg-config --variable exec_prefix freetype2`
+  prefix=`%PKG_CONFIG% --variable prefix freetype2`
+  exec_prefix=`%PKG_CONFIG% --variable exec_prefix freetype2`
 
-  includedir=`pkg-config --variable includedir freetype2`
-  libdir=`pkg-config --variable libdir freetype2`
+  includedir=`%PKG_CONFIG% --variable includedir freetype2`
+  libdir=`%PKG_CONFIG% --variable libdir freetype2`
 
-  version=`pkg-config --modversion freetype2`
+  version=`%PKG_CONFIG% --modversion freetype2`
 
-  cflags=`pkg-config --cflags freetype2`
-  dynamic_libs=`pkg-config --libs freetype2`
-  static_libs=`pkg-config --static --libs freetype2`
+  cflags=`%PKG_CONFIG% --cflags freetype2`
+  dynamic_libs=`%PKG_CONFIG% --libs freetype2`
+  static_libs=`%PKG_CONFIG% --static --libs freetype2`
 else
   prefix="%prefix%"
   exec_prefix="%exec_prefix%"
index c4dfda4..2d759ec 100644 (file)
@@ -4,7 +4,7 @@ libdir=%libdir%
 includedir=%includedir%
 
 Name: FreeType 2
-URL: http://freetype.org
+URL: https://freetype.org
 Description: A free, high-quality, and portable font engine.
 Version: %ft_version%
 Requires:
index 172212f..af2e659 100644 (file)
@@ -1,7 +1,7 @@
 # Configure paths for FreeType2
 # Marcelo Magallon 2001-10-26, based on gtk.m4 by Owen Taylor
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 27dd7d5..00eda49 100644 (file)
@@ -1,6 +1,6 @@
 ## FreeType specific autoconf tests
 #
-# Copyright 2002-2017 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index abd101d..5159693 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    UNIX-specific configuration file (specification only).               */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -397,6 +397,14 @@ FT_BEGIN_HEADER
 #endif
 
 
+  /* Use FT_LOCAL and FT_LOCAL_DEF to declare and define, respectively, */
+  /* a function that gets used only within the scope of a module.       */
+  /* Normally, both the header and source code files for such a         */
+  /* function are within a single module directory.                     */
+  /*                                                                    */
+  /* Intra-module arrays should be tagged with FT_LOCAL_ARRAY and       */
+  /* FT_LOCAL_ARRAY_DEF.                                                */
+  /*                                                                    */
 #ifdef FT_MAKE_OPTION_SINGLE_OBJECT
 
 #define FT_LOCAL( x )      static  x
@@ -418,6 +426,12 @@ FT_BEGIN_HEADER
 #define FT_LOCAL_ARRAY_DEF( x )  const  x
 
 
+  /* Use FT_BASE and FT_BASE_DEF to declare and define, respectively, */
+  /* functions that are used in more than a single module.  In the    */
+  /* current setup this implies that the declaration is in a header   */
+  /* file in the `include/freetype/internal' directory, and the       */
+  /* function body is in a file in `src/base'.                        */
+  /*                                                                  */
 #ifndef FT_BASE
 
 #ifdef __cplusplus
@@ -440,6 +454,37 @@ FT_BEGIN_HEADER
 #endif /* !FT_BASE_DEF */
 
 
+  /*   When compiling FreeType as a DLL, some systems/compilers need a     */
+  /*   special attribute 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.                                     */
+  /*                                                                       */
+  /*   To export a variable, use FT_EXPORT_VAR.                            */
+  /*                                                                       */
 #ifndef FT_EXPORT
 
 #ifdef __cplusplus
@@ -483,7 +528,13 @@ FT_BEGIN_HEADER
   /* functions which are accessed by (global) function pointers.     */
   /*                                                                 */
   /*                                                                 */
-  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */
+  /* FT_CALLBACK_DEF is used to _define_ a callback function,        */
+  /* located in the same source code file as the structure that uses */
+  /* it.                                                             */
+  /*                                                                 */
+  /* FT_BASE_CALLBACK and FT_BASE_CALLBACK_DEF are used to declare   */
+  /* and define a callback function, respectively, in a similar way  */
+  /* as FT_BASE and FT_BASE_DEF work.                                */
   /*                                                                 */
   /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
   /* contains pointers to callback functions.                        */
@@ -503,6 +554,16 @@ FT_BEGIN_HEADER
 #endif
 #endif /* FT_CALLBACK_DEF */
 
+#ifndef FT_BASE_CALLBACK
+#ifdef __cplusplus
+#define FT_BASE_CALLBACK( x )      extern "C"  x
+#define FT_BASE_CALLBACK_DEF( x )  extern "C"  x
+#else
+#define FT_BASE_CALLBACK( x )      extern  x
+#define FT_BASE_CALLBACK_DEF( x )  x
+#endif
+#endif /* FT_BASE_CALLBACK */
+
 #ifndef FT_CALLBACK_TABLE
 #ifdef __cplusplus
 #define FT_CALLBACK_TABLE      extern "C"
index 48a235b..8fdbeb0 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Unix-specific FreeType low-level system interface (body).            */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index fae486c..50325ca 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -30,6 +30,9 @@
 #
 # We also remove `$(includedir)/ft2build.h' for the same reason.
 #
+# Note that some header files get handled twice for simplicity; a special,
+# configured version overwrites the generic one.
+#
 install: $(PROJECT_LIBRARY)
        -$(DELDIR) $(DESTDIR)$(includedir)/freetype2
        -$(DELETE) $(DESTDIR)$(includedir)/ft2build.h
@@ -55,6 +58,8 @@ install: $(PROJECT_LIBRARY)
           $(DESTDIR)$(includedir)/freetype2/freetype/config/ftconfig.h
        $(INSTALL_DATA) $(OBJ_DIR)/ftmodule.h                          \
           $(DESTDIR)$(includedir)/freetype2/freetype/config/ftmodule.h
+       $(INSTALL_DATA) $(OBJ_BUILD)/ftoption.h                        \
+          $(DESTDIR)$(includedir)/freetype2/freetype/config/ftoption.h
        $(INSTALL_SCRIPT) -m 755 $(OBJ_BUILD)/freetype-config \
           $(DESTDIR)$(bindir)/freetype-config
        $(INSTALL_SCRIPT) -m 644 $(BUILD_DIR)/freetype2.m4 \
index a967cee..a06246d 100644 (file)
@@ -2,7 +2,7 @@
 # FreeType 2 template for Unix-specific compiler definitions
 #
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -93,7 +93,8 @@ CC    := $(LIBTOOL) --mode=compile $(CCraw)
 
 # Linker flags.
 #
-LDFLAGS := @LDFLAGS@
+LDFLAGS           := @LDFLAGS@
+LIB_CLOCK_GETTIME := @LIB_CLOCK_GETTIME@  # for ftbench
 
 
 # export symbols
index feae99b..059a061 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -43,6 +43,7 @@ DISTCLEAN += $(OBJ_BUILD)/config.cache  \
              $(OBJ_BUILD)/unix-def.mk   \
              $(OBJ_BUILD)/unix-cc.mk    \
              $(OBJ_BUILD)/ftconfig.h    \
+             $(OBJ_BUILD)/ftoption.h    \
              $(LIBTOOL)                 \
              $(OBJ_BUILD)/Makefile
 
@@ -62,6 +63,7 @@ version_info := @version_info@
 
 # Variables needed for `freetype-config' and `freetype.pc'.
 #
+PKG_CONFIG         := @PKG_CONFIG@
 REQUIRES_PRIVATE   := @REQUIRES_PRIVATE@
 LIBS_PRIVATE       := @LIBS_PRIVATE@
 LIBSSTATIC_CONFIG  := @LIBSSTATIC_CONFIG@
@@ -102,6 +104,7 @@ NO_OUTPUT := 2> /dev/null
 $(OBJ_BUILD)/freetype-config: $(TOP_DIR)/builds/unix/freetype-config.in
        rm -f $@ $@.tmp
        sed -e 's|%LIBSSTATIC_CONFIG%|$(LIBSSTATIC_CONFIG)|'   \
+           -e 's|%PKG_CONFIG%|$(PKG_CONFIG)|'                 \
            -e 's|%build_libtool_libs%|$(build_libtool_libs)|' \
            -e 's|%exec_prefix%|$(exec_prefix)|'               \
            -e 's|%ft_version%|$(ft_version)|'                 \
index 92c0600..5a516ad 100644 (file)
@@ -6,7 +6,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 5122fde..73a02d4 100644 (file)
@@ -6,7 +6,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 14d5c0c..acd54d3 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 30f2307..a8da63a 100644 (file)
@@ -4,7 +4,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index f8ac2ec..fa4aa11 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    VMS-specific configuration file (specification only).                */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -33,6 +33,7 @@
   /*                                                                       */
   /*************************************************************************/
 
+
 #ifndef FTCONFIG_H_
 #define FTCONFIG_H_
 
@@ -209,12 +210,12 @@ FT_BEGIN_HEADER
 
 #endif
 
-#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)
+#if FT_SIZEOF_INT == 4
 
   typedef signed int      FT_Int32;
   typedef unsigned int    FT_UInt32;
 
-#elif FT_SIZEOF_LONG == (32 / FT_CHAR_BIT)
+#elif FT_SIZEOF_LONG == 4
 
   typedef signed long     FT_Int32;
   typedef unsigned long   FT_UInt32;
@@ -225,12 +226,12 @@ FT_BEGIN_HEADER
 
 
   /* look up an integer type that is at least 32 bits */
-#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)
+#if FT_SIZEOF_INT >= 4
 
   typedef int            FT_Fast;
   typedef unsigned int   FT_UFast;
 
-#elif FT_SIZEOF_LONG >= (32 / FT_CHAR_BIT)
+#elif FT_SIZEOF_LONG >= 4
 
   typedef long           FT_Fast;
   typedef unsigned long  FT_UFast;
@@ -238,15 +239,25 @@ FT_BEGIN_HEADER
 #endif
 
 
-  /* determine whether we have a 64-bit int type for platforms without */
-  /* Autoconf                                                          */
-#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)
+  /* determine whether we have a 64-bit int type  */
+  /* (mostly for environments 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
 #define FT_UINT64  unsigned long
 
+  /* we handle the LLP64 scheme separately for GCC and clang, */
+  /* suppressing the `long long' warning                      */
+#elif ( FT_SIZEOF_LONG == 4 )       && \
+      defined( HAVE_LONG_LONG_INT ) && \
+      defined( __GNUC__ )
+#pragma GCC diagnostic ignored "-Wlong-long"
+#define FT_LONG64
+#define FT_INT64   long long int
+#define FT_UINT64  unsigned long long int
+
   /*************************************************************************/
   /*                                                                       */
   /* A 64-bit data type may create compilation problems if you compile     */
@@ -298,7 +309,7 @@ FT_BEGIN_HEADER
 
 #endif /* __STDC_VERSION__ >= 199901L */
 
-#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
+#endif /* FT_SIZEOF_LONG == 8 */
 
 #ifdef FT_LONG64
   typedef FT_INT64   FT_Int64;
@@ -338,6 +349,14 @@ FT_BEGIN_HEADER
 #endif
 
 
+  /* Use FT_LOCAL and FT_LOCAL_DEF to declare and define, respectively, */
+  /* a function that gets used only within the scope of a module.       */
+  /* Normally, both the header and source code files for such a         */
+  /* function are within a single module directory.                     */
+  /*                                                                    */
+  /* Intra-module arrays should be tagged with FT_LOCAL_ARRAY and       */
+  /* FT_LOCAL_ARRAY_DEF.                                                */
+  /*                                                                    */
 #ifdef FT_MAKE_OPTION_SINGLE_OBJECT
 
 #define FT_LOCAL( x )      static  x
@@ -359,6 +378,12 @@ FT_BEGIN_HEADER
 #define FT_LOCAL_ARRAY_DEF( x )  const  x
 
 
+  /* Use FT_BASE and FT_BASE_DEF to declare and define, respectively, */
+  /* functions that are used in more than a single module.  In the    */
+  /* current setup this implies that the declaration is in a header   */
+  /* file in the `include/freetype/internal' directory, and the       */
+  /* function body is in a file in `src/base'.                        */
+  /*                                                                  */
 #ifndef FT_BASE
 
 #ifdef __cplusplus
@@ -381,6 +406,37 @@ FT_BEGIN_HEADER
 #endif /* !FT_BASE_DEF */
 
 
+  /*   When compiling FreeType as a DLL, some systems/compilers need a     */
+  /*   special attribute 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.                                     */
+  /*                                                                       */
+  /*   To export a variable, use FT_EXPORT_VAR.                            */
+  /*                                                                       */
 #ifndef FT_EXPORT
 
 #ifdef __cplusplus
@@ -424,7 +480,13 @@ FT_BEGIN_HEADER
   /* functions which are accessed by (global) function pointers.     */
   /*                                                                 */
   /*                                                                 */
-  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */
+  /* FT_CALLBACK_DEF is used to _define_ a callback function,        */
+  /* located in the same source code file as the structure that uses */
+  /* it.                                                             */
+  /*                                                                 */
+  /* FT_BASE_CALLBACK and FT_BASE_CALLBACK_DEF are used to declare   */
+  /* and define a callback function, respectively, in a similar way  */
+  /* as FT_BASE and FT_BASE_DEF work.                                */
   /*                                                                 */
   /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
   /* contains pointers to callback functions.                        */
@@ -444,6 +506,16 @@ FT_BEGIN_HEADER
 #endif
 #endif /* FT_CALLBACK_DEF */
 
+#ifndef FT_BASE_CALLBACK
+#ifdef __cplusplus
+#define FT_BASE_CALLBACK( x )      extern "C"  x
+#define FT_BASE_CALLBACK_DEF( x )  extern "C"  x
+#else
+#define FT_BASE_CALLBACK( x )      extern  x
+#define FT_BASE_CALLBACK_DEF( x )  x
+#endif
+#endif /* FT_BASE_CALLBACK */
+
 #ifndef FT_CALLBACK_TABLE
 #ifdef __cplusplus
 #define FT_CALLBACK_TABLE      extern "C"
index d83e8ec..7d79f9a 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    VMS-specific FreeType low-level system interface (body).             */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 7a20e2f..83c5f44 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Debugging and logging component for WinCE (body).                    */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -79,7 +79,7 @@
 
 
     va_start( ap, fmt );
-    vprintf( fmt, ap );
+    vfprintf( stderr, fmt, ap );
     /* send the string to the debugger as well */
     vsprintf( buf, fmt, ap );
     OutputDebugStringEx( buf );
index a1c0e37..215028a 100644 (file)
@@ -21,7 +21,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />\r
       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
       <Tool Name="VCPreLinkEventTool" />\r
-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype28.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\r
@@ -41,7 +41,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />\r
       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
       <Tool Name="VCPreLinkEventTool" />\r
-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype28.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\r
@@ -61,7 +61,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />\r
       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
       <Tool Name="VCPreLinkEventTool" />\r
-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype28.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\r
@@ -81,7 +81,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />\r
       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
       <Tool Name="VCPreLinkEventTool" />\r
-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype28.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29MT.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29MT.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29MT.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29MT.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29MT.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29MT.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28ST.lib" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29ST.lib" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28ST.lib" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29ST.lib" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28ST.lib" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29ST.lib" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28ST.lib" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29ST.lib" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28ST.lib" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29ST.lib" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28ST.lib" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29ST.lib" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28ST_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29ST_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28ST_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29ST_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28ST_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29ST_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28ST_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29ST_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28ST_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29ST_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28ST_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29ST_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29MT_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29MT_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29MT_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29MT_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29MT_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29MT_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29MT.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\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\freetype28MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\wince\vc2005-ce\freetype29MT_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\r
index fcb52bc..2672415 100644 (file)
@@ -21,14 +21,14 @@ the following targets:
   <li>PPC/SP WM6 (Windows Mobile 6)</li>
 </ul>
 
-It compiles the following libraries from the FreeType 2.8 sources:</p>
+It compiles the following libraries from the FreeType 2.9 sources:</p>
 
 <ul>
   <pre>
-    freetype28.lib     - release build; single threaded
-    freetype28_D.lib   - debug build;   single threaded
-    freetype28MT.lib   - release build; multi-threaded
-    freetype28MT_D.lib - debug build;   multi-threaded</pre>
+    freetype29.lib     - release build; single threaded
+    freetype29_D.lib   - debug build;   single threaded
+    freetype29MT.lib   - release build; multi-threaded
+    freetype29MT_D.lib - debug build;   multi-threaded</pre>
 </ul>
 
 <p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
index 273aa53..9be8588 100644 (file)
@@ -88,7 +88,7 @@
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\wince\vc2008-ce\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
index 7366843..18f2a48 100644 (file)
@@ -21,14 +21,14 @@ the following targets:
   <li>PPC/SP WM6 (Windows Mobile 6)</li>
 </ul>
 
-It compiles the following libraries from the FreeType 2.8 sources:</p>
+It compiles the following libraries from the FreeType 2.9 sources:</p>
 
 <ul>
   <pre>
-    freetype28.lib     - release build; single threaded
-    freetype28_D.lib   - debug build;   single threaded
-    freetype28MT.lib   - release build; multi-threaded
-    freetype28MT_D.lib - debug build;   multi-threaded</pre>
+    freetype29.lib     - release build; single threaded
+    freetype29_D.lib   - debug build;   single threaded
+    freetype29MT.lib   - release build; multi-threaded
+    freetype29MT_D.lib - debug build;   multi-threaded</pre>
 </ul>
 
 <p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
index 350d156..b047e02 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -77,7 +77,7 @@ ifeq ($(PLATFORM),windows)
   # 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
+  # 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)
index cadfcea..ec70a0e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Debugging and logging component for Win32 (body).                    */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -65,7 +65,7 @@
 
 
     va_start( ap, fmt );
-    vprintf( fmt, ap );
+    vfprintf( stderr, fmt, ap );
     /* send the string to the debugger as well */
     vsprintf( buf, fmt, ap );
     OutputDebugStringA( buf );
diff --git a/builds/windows/ftver.rc b/builds/windows/ftver.rc
new file mode 100644 (file)
index 0000000..1093109
--- /dev/null
@@ -0,0 +1,43 @@
+#include<Windows.h>
+
+#define FT_VERSION      2,9,0,0
+#define FT_VERSION_STR  "2.9.0"
+
+VS_VERSION_INFO      VERSIONINFO
+FILEVERSION          FT_VERSION
+PRODUCTVERSION       FT_VERSION
+FILEFLAGSMASK        VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+FILEFLAGS            VS_FF_DEBUG
+#endif
+#ifdef _DLL
+FILETYPE             VFT_DLL
+#define FT_FILENAME  "freetype.dll"
+#else
+FILETYPE             VFT_STATIC_LIB
+#define FT_FILENAME  "freetype.lib"
+#endif
+BEGIN
+  BLOCK "StringFileInfo"
+  BEGIN
+    BLOCK "040904E4"
+    BEGIN
+      VALUE "CompanyName",      "The FreeType Project"
+      VALUE "FileDescription",  "Font Rendering Library"
+      VALUE "FileVersion",      FT_VERSION_STR
+      VALUE "ProductName",      "FreeType"
+      VALUE "ProductVersion",   FT_VERSION_STR
+      VALUE "LegalCopyright",   "© 2017 The FreeType Project www.freetype.org. All rights reserved."
+      VALUE "InternalName",     "freetype"
+      VALUE "OriginalFilename", FT_FILENAME
+    END
+  END
+
+  BLOCK "VarFileInfo"
+  BEGIN
+    /* The following line should only be modified for localized versions.  */
+    /* It consists of any number of WORD,WORD pairs, with each pair        */
+    /* describing a "language,codepage" combination supported by the file. */
+    VALUE "Translation", 0x409, 1252
+  END
+END
index e5e67d5..386d79d 100644 (file)
@@ -16,7 +16,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />\r
       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
       <Tool Name="VCPreLinkEventTool" />\r
-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype28.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype29.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\r
@@ -33,7 +33,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />\r
       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
       <Tool Name="VCPreLinkEventTool" />\r
-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype28MT.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype29MT.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\r
@@ -50,7 +50,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />\r
       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="NDEBUG" Culture="1033" />\r
       <Tool Name="VCPreLinkEventTool" />\r
-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype28ST.lib" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype29ST.lib" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\r
@@ -67,7 +67,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />\r
       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
       <Tool Name="VCPreLinkEventTool" />\r
-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype28_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype29_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\r
@@ -84,7 +84,7 @@
       <Tool Name="VCManagedResourceCompilerTool" />\r
       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
       <Tool Name="VCPreLinkEventTool" />\r
-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype28ST_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype29ST_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\r
       <Tool Name="VCManagedResourceCompilerTool" />\r
       <Tool Name="VCResourceCompilerTool" PreprocessorDefinitions="_DEBUG" Culture="1033" />\r
       <Tool Name="VCPreLinkEventTool" />\r
-      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype28MT_D.lib" SuppressStartupBanner="true" />\r
+      <Tool Name="VCLibrarianTool" OutputFile="..\..\..\objs\win32\vc2005\freetype29MT_D.lib" SuppressStartupBanner="true" />\r
       <Tool Name="VCALinkTool" />\r
       <Tool Name="VCXDCMakeTool" />\r
       <Tool Name="VCBscMakeTool" />\r
         </FileConfiguration>\r
       </File>\r
       <Filter Name="FT_MODULES">\r
+        <File RelativePath="..\..\..\src\base\ftbdf.c">\r
+        </File>\r
         <File RelativePath="..\..\..\src\base\ftbbox.c">\r
         </File>\r
+        <File RelativePath="..\..\..\src\base\ftcid.c">\r
+        </File>\r
         <File RelativePath="..\..\..\src\base\ftfntfmt.c">\r
         </File>\r
         <File RelativePath="..\..\..\src\base\ftmm.c">\r
index 4bd9b75..a25e674 100644 (file)
 
 <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.8 sources:</p>
+compiles the following libraries from the FreeType 2.9 sources:</p>
 
 <ul>
   <pre>
-    freetype28.lib     - release build; single threaded
-    freetype28_D.lib   - debug build;   single threaded
-    freetype28MT.lib   - release build; multi-threaded
-    freetype28MT_D.lib - debug build;   multi-threaded</pre>
+    freetype29.lib     - release build; single threaded
+    freetype29_D.lib   - debug build;   single threaded
+    freetype29MT.lib   - release build; multi-threaded
+    freetype29MT_D.lib - debug build;   multi-threaded</pre>
 </ul>
 
 <p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
index a8bc672..f2d1fe7 100644 (file)
@@ -70,7 +70,7 @@
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\win32\vc2008\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\win32\vc2008\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\win32\vc2008\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\win32\vc2008\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\win32\vc2008\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\win32\vc2008\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\win32\vc2008\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\win32\vc2008\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\win32\vc2008\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\win32\vc2008\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\win32\vc2008\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\win32\vc2008\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\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\ftfntfmt.c"\r
                                        >\r
                                </File>\r
index fa5909d..e0fdf2d 100644 (file)
 
 <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.8 sources:</p>
+compiles the following libraries from the FreeType 2.9 sources:</p>
 
 <ul>
   <pre>
-    freetype28.lib     - release build; single threaded
-    freetype28_D.lib   - debug build;   single threaded
-    freetype28MT.lib   - release build; multi-threaded
-    freetype28MT_D.lib - debug build;   multi-threaded</pre>
+    freetype29.lib     - release build; single threaded
+    freetype29_D.lib   - debug build;   single threaded
+    freetype29MT.lib   - release build; multi-threaded
+    freetype29MT_D.lib - debug build;   multi-threaded</pre>
 </ul>
 
 <p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
index e4f11fc..8eb5b9a 100644 (file)
@@ -9,20 +9,12 @@
       <Configuration>Debug</Configuration>\r
       <Platform>x64</Platform>\r
     </ProjectConfiguration>\r
-    <ProjectConfiguration Include="Debug Multithreaded|Win32">\r
-      <Configuration>Debug Multithreaded</Configuration>\r
+    <ProjectConfiguration Include="Debug Static|Win32">\r
+      <Configuration>Debug Static</Configuration>\r
       <Platform>Win32</Platform>\r
     </ProjectConfiguration>\r
-    <ProjectConfiguration Include="Debug Multithreaded|x64">\r
-      <Configuration>Debug Multithreaded</Configuration>\r
-      <Platform>x64</Platform>\r
-    </ProjectConfiguration>\r
-    <ProjectConfiguration Include="Debug Singlethreaded|Win32">\r
-      <Configuration>Debug Singlethreaded</Configuration>\r
-      <Platform>Win32</Platform>\r
-    </ProjectConfiguration>\r
-    <ProjectConfiguration Include="Debug Singlethreaded|x64">\r
-      <Configuration>Debug Singlethreaded</Configuration>\r
+    <ProjectConfiguration Include="Debug Static|x64">\r
+      <Configuration>Debug Static</Configuration>\r
       <Platform>x64</Platform>\r
     </ProjectConfiguration>\r
     <ProjectConfiguration Include="Release|Win32">\r
       <Configuration>Release</Configuration>\r
       <Platform>x64</Platform>\r
     </ProjectConfiguration>\r
-    <ProjectConfiguration Include="Release Multithreaded|Win32">\r
-      <Configuration>Release Multithreaded</Configuration>\r
+    <ProjectConfiguration Include="Release Static|Win32">\r
+      <Configuration>Release Static</Configuration>\r
       <Platform>Win32</Platform>\r
     </ProjectConfiguration>\r
-    <ProjectConfiguration Include="Release Multithreaded|x64">\r
-      <Configuration>Release Multithreaded</Configuration>\r
-      <Platform>x64</Platform>\r
-    </ProjectConfiguration>\r
-    <ProjectConfiguration Include="Release Singlethreaded|Win32">\r
-      <Configuration>Release Singlethreaded</Configuration>\r
-      <Platform>Win32</Platform>\r
-    </ProjectConfiguration>\r
-    <ProjectConfiguration Include="Release Singlethreaded|x64">\r
-      <Configuration>Release Singlethreaded</Configuration>\r
+    <ProjectConfiguration Include="Release Static|x64">\r
+      <Configuration>Release Static</Configuration>\r
       <Platform>x64</Platform>\r
     </ProjectConfiguration>\r
   </ItemGroup>\r
+    <!--\r
+    Switch the PlatformToolset based on the Visual Studio Version\r
+-->\r
+<PropertyGroup>\r
+    <!-- Assume Visual Studio 2010 / 4.0 as the default -->\r
+    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">4.0</VisualStudioVersion>\r
+</PropertyGroup>\r
+<!-- Visual Studio 2010 (4.0) -->\r
+<PropertyGroup Condition="'$(VisualStudioVersion)' == '4.0'">\r
+    <PlatformToolset>v100</PlatformToolset>\r
+</PropertyGroup>\r
+<!-- Visual Studio 2013 (12.0) -->\r
+<PropertyGroup Condition="'$(VisualStudioVersion)' == '12.0'">\r
+    <PlatformToolset>v120</PlatformToolset>\r
+</PropertyGroup>\r
+<!-- Visual Studio 2015 (14.0) -->\r
+<PropertyGroup Condition="'$(VisualStudioVersion)' == '14.0'">\r
+    <PlatformToolset>v140</PlatformToolset>\r
+</PropertyGroup>\r
+<!-- Visual Studio 2017 (15.0) -->\r
+<PropertyGroup Condition="'$(VisualStudioVersion)' == '15.0'">\r
+    <PlatformToolset>v141</PlatformToolset>\r
+</PropertyGroup>\r
+<!--\r
+    End of: Switch the PlatformToolset based on the Visual Studio Version\r
+-->\r
   <PropertyGroup Label="Globals">\r
-    <ProjectGuid>{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}</ProjectGuid>\r
+     <ProjectGuid>{78B079BD-9FC7-4B9E-B4A6-96DA0F00248B}</ProjectGuid>\r
+     <RootNamespace>FreeType</RootNamespace>\r
   </PropertyGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
-    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
-    <PlatformToolset>v100</PlatformToolset>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">\r
-    <ConfigurationType>StaticLibrary</ConfigurationType>\r
-    <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
-    <PlatformToolset>v100</PlatformToolset>\r
-  </PropertyGroup>\r
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'" Label="Configuration">\r
-    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
-    <PlatformToolset>v100</PlatformToolset>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'" Label="Configuration">\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
-    <PlatformToolset>v100</PlatformToolset>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'" Label="Configuration">\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
-    <PlatformToolset>v100</PlatformToolset>\r
-  </PropertyGroup>\r
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'" Label="Configuration">\r
-    <ConfigurationType>StaticLibrary</ConfigurationType>\r
-    <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
-    <PlatformToolset>v100</PlatformToolset>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
-    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
-    <PlatformToolset>v100</PlatformToolset>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">\r
-    <ConfigurationType>StaticLibrary</ConfigurationType>\r
+    <ConfigurationType>DynamicLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
-    <PlatformToolset>v100</PlatformToolset>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'" Label="Configuration">\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
-    <PlatformToolset>v100</PlatformToolset>\r
+    <CharacterSet>Unicode</CharacterSet>\r
   </PropertyGroup>\r
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'" Label="Configuration">\r
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'" Label="Configuration">\r
     <ConfigurationType>StaticLibrary</ConfigurationType>\r
     <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
-    <PlatformToolset>v100</PlatformToolset>\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
-    <PlatformToolset>v100</PlatformToolset>\r
-  </PropertyGroup>\r
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'" Label="Configuration">\r
-    <ConfigurationType>StaticLibrary</ConfigurationType>\r
-    <UseOfMfc>false</UseOfMfc>\r
-    <CharacterSet>MultiByte</CharacterSet>\r
-    <PlatformToolset>v100</PlatformToolset>\r
+    <CharacterSet>Unicode</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)'=='Debug|Win32'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>\r
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>\r
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>\r
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>\r
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>\r
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>\r
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>\r
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>\r
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>\r
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>\r
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>\r
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>\r
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>\r
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>\r
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>\r
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>\r
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>\r
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>\r
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>\r
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>\r
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>\r
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>\r
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\</OutDir>\r
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">.\..\..\..\objs\vc2010\$(Platform)\$(Configuration)\</IntDir>\r
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />\r
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />\r
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'" />\r
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'" />\r
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'" />\r
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'" />\r
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'" />\r
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'" />\r
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'" />\r
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'" />\r
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />\r
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />\r
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'" />\r
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'" />\r
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'" />\r
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'" />\r
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>\r
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">AllRules.ruleset</CodeAnalysisRuleSet>\r
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'" />\r
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'" />\r
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'" />\r
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'" />\r
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">freetype28d</TargetName>\r
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">freetype28d</TargetName>\r
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">freetype28MTd</TargetName>\r
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">freetype28MTd</TargetName>\r
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">freetype28STd</TargetName>\r
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">freetype28STd</TargetName>\r
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">freetype28</TargetName>\r
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">freetype28</TargetName>\r
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">freetype28MT</TargetName>\r
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">freetype28MT</TargetName>\r
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">freetype28ST</TargetName>\r
-    <TargetName Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">freetype28ST</TargetName>\r
+    <OutDir>..\..\..\objs\$(Platform)\$(Configuration)\</OutDir>\r
+    <IntDir>..\..\..\objs\$(Platform)\$(Configuration)\</IntDir>\r
+    <CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>\r
+    <CodeAnalysisRules />\r
+    <CodeAnalysisRuleAssemblies />\r
+    <TargetName>freetype</TargetName>\r
   </PropertyGroup>\r
   <Import Project="$(SolutionDir)\freetype.user.props" Condition="exists('$(SolutionDir)\freetype.user.props')" Label="UserProperties" />\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <DisableLanguageExtensions>true</DisableLanguageExtensions>\r
       <InlineFunctionExpansion>Disabled</InlineFunctionExpansion>\r
     </ClCompile>\r
     <ResourceCompile>\r
-      <PreprocessorDefinitions>_DEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;_DLL;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <Culture>0x0409</Culture>\r
     </ResourceCompile>\r
     <Lib>\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\r
       <DisableLanguageExtensions>true</DisableLanguageExtensions>\r
       <InlineFunctionExpansion>Disabled</InlineFunctionExpansion>\r
     </ClCompile>\r
     <ResourceCompile>\r
-      <PreprocessorDefinitions>_DEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>_DEBUG;_DLL;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <Culture>0x0409</Culture>\r
     </ResourceCompile>\r
     <Lib>\r
       <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>\r
     </Lib>\r
   </ItemDefinitionGroup>\r
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|Win32'">\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(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;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessToFile>false</PreprocessToFile>\r
-      <PreprocessSuppressLineNumbers>false</PreprocessSuppressLineNumbers>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
       <DisableLanguageExtensions>true</DisableLanguageExtensions>\r
       <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>\r
     </Lib>\r
   </ItemDefinitionGroup>\r
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Static|x64'">\r
     <ClCompile>\r
       <Optimization>Disabled</Optimization>\r
       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(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;$(UserDefines);%(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
-      <CompileAsManaged>false</CompileAsManaged>\r
-      <ProgramDataBaseFileName>$(OutDir)$(TargetName).pdb</ProgramDataBaseFileName>\r
-      <InlineFunctionExpansion>Disabled</InlineFunctionExpansion>\r
-    </ClCompile>\r
-    <ResourceCompile>\r
-      <PreprocessorDefinitions>_DEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Culture>0x0409</Culture>\r
-    </ResourceCompile>\r
-    <Lib>\r
-      <SuppressStartupBanner>true</SuppressStartupBanner>\r
-      <TargetMachine>MachineX64</TargetMachine>\r
-      <AdditionalLibraryDirectories>$(UserLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
-      <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>\r
-    </Lib>\r
-  </ItemDefinitionGroup>\r
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">\r
-    <ClCompile>\r
-      <Optimization>Disabled</Optimization>\r
-      <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(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
-      <CompileAsManaged>false</CompileAsManaged>\r
-      <ProgramDataBaseFileName>$(OutDir)$(TargetName).pdb</ProgramDataBaseFileName>\r
-      <InlineFunctionExpansion>Disabled</InlineFunctionExpansion>\r
-    </ClCompile>\r
-    <ResourceCompile>\r
-      <PreprocessorDefinitions>_DEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Culture>0x0409</Culture>\r
-    </ResourceCompile>\r
-    <Lib>\r
-      <SuppressStartupBanner>true</SuppressStartupBanner>\r
-      <TargetMachine>MachineX86</TargetMachine>\r
-      <AdditionalLibraryDirectories>$(UserLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
-      <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>\r
-    </Lib>\r
-  </ItemDefinitionGroup>\r
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">\r
-    <ClCompile>\r
-      <Optimization>Disabled</Optimization>\r
-      <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>_DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT_DEBUG_LEVEL_ERROR;FT_DEBUG_LEVEL_TRACE;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>\r
       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\r
       <DisableLanguageExtensions>true</DisableLanguageExtensions>\r
   </ItemDefinitionGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
     <ClCompile>\r
-      <Optimization>Full</Optimization>\r
+      <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <OmitFramePointers>true</OmitFramePointers>\r
     </ClCompile>\r
     <ResourceCompile>\r
-      <PreprocessorDefinitions>NDEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;_DLL;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <Culture>0x0409</Culture>\r
     </ResourceCompile>\r
     <Lib>\r
   </ItemDefinitionGroup>\r
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">\r
     <ClCompile>\r
-      <Optimization>Full</Optimization>\r
+      <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <OmitFramePointers>true</OmitFramePointers>\r
     </ClCompile>\r
     <ResourceCompile>\r
-      <PreprocessorDefinitions>NDEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>NDEBUG;_DLL;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <Culture>0x0409</Culture>\r
     </ResourceCompile>\r
     <Lib>\r
       <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>\r
     </Lib>\r
   </ItemDefinitionGroup>\r
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|Win32'">\r
     <ClCompile>\r
-      <Optimization>Full</Optimization>\r
+      <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>\r
     </Lib>\r
   </ItemDefinitionGroup>\r
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">\r
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Static|x64'">\r
     <ClCompile>\r
-      <Optimization>Full</Optimization>\r
+      <Optimization>MaxSpeed</Optimization>\r
       <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
       <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+      <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
       <StringPooling>true</StringPooling>\r
       <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
       <FunctionLevelLinking>true</FunctionLevelLinking>\r
       <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>\r
     </Lib>\r
   </ItemDefinitionGroup>\r
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">\r
-    <ClCompile>\r
-      <Optimization>Full</Optimization>\r
-      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
-      <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <StringPooling>true</StringPooling>\r
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
-      <FunctionLevelLinking>true</FunctionLevelLinking>\r
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>\r
-      <WarningLevel>Level4</WarningLevel>\r
-      <CompileAs>Default</CompileAs>\r
-      <DisableSpecificWarnings>4001</DisableSpecificWarnings>\r
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
-      <WholeProgramOptimization>false</WholeProgramOptimization>\r
-      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
-      <FloatingPointExceptions>false</FloatingPointExceptions>\r
-      <CreateHotpatchableImage>false</CreateHotpatchableImage>\r
-      <CompileAsManaged>false</CompileAsManaged>\r
-      <ProgramDataBaseFileName>\r
-      </ProgramDataBaseFileName>\r
-      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>\r
-      <DebugInformationFormat>\r
-      </DebugInformationFormat>\r
-      <IntrinsicFunctions>true</IntrinsicFunctions>\r
-      <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>\r
-      <OmitFramePointers>true</OmitFramePointers>\r
-    </ClCompile>\r
-    <ResourceCompile>\r
-      <PreprocessorDefinitions>NDEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Culture>0x0409</Culture>\r
-    </ResourceCompile>\r
-    <Lib />\r
-    <Lib>\r
-      <LinkTimeCodeGeneration>true</LinkTimeCodeGeneration>\r
-      <TargetMachine>MachineX86</TargetMachine>\r
-      <AdditionalLibraryDirectories>$(UserLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
-      <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>\r
-    </Lib>\r
-  </ItemDefinitionGroup>\r
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">\r
-    <ClCompile>\r
-      <Optimization>Full</Optimization>\r
-      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>\r
-      <AdditionalIncludeDirectories>$(UserOptionDirectory);..\..\..\include;$(UserIncludeDirectories);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;FT2_BUILD_LIBRARY;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <StringPooling>true</StringPooling>\r
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\r
-      <FunctionLevelLinking>true</FunctionLevelLinking>\r
-      <DisableLanguageExtensions>true</DisableLanguageExtensions>\r
-      <WarningLevel>Level4</WarningLevel>\r
-      <CompileAs>Default</CompileAs>\r
-      <DisableSpecificWarnings>4001</DisableSpecificWarnings>\r
-      <MultiProcessorCompilation>true</MultiProcessorCompilation>\r
-      <WholeProgramOptimization>false</WholeProgramOptimization>\r
-      <EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>\r
-      <FloatingPointExceptions>false</FloatingPointExceptions>\r
-      <CreateHotpatchableImage>false</CreateHotpatchableImage>\r
-      <CompileAsManaged>false</CompileAsManaged>\r
-      <ProgramDataBaseFileName>\r
-      </ProgramDataBaseFileName>\r
-      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>\r
-      <DebugInformationFormat>\r
-      </DebugInformationFormat>\r
-      <IntrinsicFunctions>true</IntrinsicFunctions>\r
-      <FavorSizeOrSpeed>Neither</FavorSizeOrSpeed>\r
-      <OmitFramePointers>true</OmitFramePointers>\r
-    </ClCompile>\r
-    <ResourceCompile>\r
-      <PreprocessorDefinitions>NDEBUG;$(UserDefines);%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Culture>0x0409</Culture>\r
-    </ResourceCompile>\r
-    <Lib />\r
-    <Lib>\r
-      <LinkTimeCodeGeneration>true</LinkTimeCodeGeneration>\r
-      <TargetMachine>MachineX64</TargetMachine>\r
-      <AdditionalLibraryDirectories>$(UserLibraryDirectories);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\r
-      <AdditionalDependencies>$(UserDependencies);%(AdditionalDependencies)</AdditionalDependencies>\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
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\cff\cff.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftbase.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftbase.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftbbox.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftbdf.c" />\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
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\ftdebug.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">false</DisableLanguageExtensions>\r
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">false</DisableLanguageExtensions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">false</DisableLanguageExtensions>\r
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">false</DisableLanguageExtensions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableLanguageExtensions>\r
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DisableLanguageExtensions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">false</DisableLanguageExtensions>\r
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">false</DisableLanguageExtensions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">false</DisableLanguageExtensions>\r
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">false</DisableLanguageExtensions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</DisableLanguageExtensions>\r
-      <DisableLanguageExtensions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</DisableLanguageExtensions>\r
-    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftcid.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftfntfmt.c" />\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
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\gzip\ftgzip.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftinit.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\lzw\ftlzw.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(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
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\smooth\smooth.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftbbox.c" />\r
-    <ClCompile Include="..\..\..\src\base\ftfntfmt.c" />\r
-    <ClCompile Include="..\..\..\src\base\ftmm.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\base\ftglyph.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftgxval.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftinit.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftlcdfil.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftmm.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftotval.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftpatent.c" />\r
     <ClCompile Include="..\..\..\src\base\ftpfr.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftstroke.c" />\r
     <ClCompile Include="..\..\..\src\base\ftsynth.c" />\r
+    <ClCompile Include="..\..\..\src\base\ftsystem.c" />\r
     <ClCompile Include="..\..\..\src\base\fttype1.c" />\r
     <ClCompile Include="..\..\..\src\base\ftwinfnt.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
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\pfr\pfr.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\psaux\psaux.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\pshinter\pshinter.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\psnames\psmodule.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\raster\raster.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\sfnt\sfnt.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\truetype\truetype.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\type1\type1.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\cid\type1cid.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\type42\type42.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-    </ClCompile>\r
-    <ClCompile Include="..\..\..\src\winfonts\winfnt.c">\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Multithreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug Singlethreaded|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Disabled</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>\r
-      <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">EnableFastChecks</BasicRuntimeChecks>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Multithreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release Singlethreaded|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>\r
-      <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|x64'">MaxSpeed</Optimization>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
-      <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+    <ClCompile Include="..\..\..\src\bdf\bdf.c" />\r
+    <ClCompile Include="..\..\..\src\cache\ftcache.c" />\r
+    <ClCompile Include="..\..\..\src\cff\cff.c" />\r
+    <ClCompile Include="..\..\..\src\cid\type1cid.c" />\r
+    <ClCompile Include="..\..\..\src\gzip\ftgzip.c" />\r
+    <ClCompile Include="..\..\..\src\lzw\ftlzw.c" />\r
+    <ClCompile Include="..\..\..\src\pcf\pcf.c" />\r
+    <ClCompile Include="..\..\..\src\pfr\pfr.c" />\r
+    <ClCompile Include="..\..\..\src\psaux\psaux.c" />\r
+    <ClCompile Include="..\..\..\src\pshinter\pshinter.c" />\r
+    <ClCompile Include="..\..\..\src\psnames\psmodule.c" />\r
+    <ClCompile Include="..\..\..\src\raster\raster.c" />\r
+    <ClCompile Include="..\..\..\src\sfnt\sfnt.c" />\r
+    <ClCompile Include="..\..\..\src\smooth\smooth.c" />\r
+    <ClCompile Include="..\..\..\src\truetype\truetype.c" />\r
+    <ClCompile Include="..\..\..\src\type1\type1.c" />\r
+    <ClCompile Include="..\..\..\src\type42\type42.c" />\r
+    <ClCompile Include="..\..\..\src\winfonts\winfnt.c" />\r
+    <ClCompile Include="..\ftdebug.c">\r
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>\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
+    <ResourceCompile Include="..\ftver.rc" />\r
   </ItemGroup>\r
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
   <ImportGroup Label="ExtensionTargets">\r
   </ImportGroup>\r
-</Project>
\ No newline at end of file
+  <Target Name="AfterBuild">\r
+    <Copy SourceFiles="$(TargetPath)" DestinationFolder="..\..\..\objs" />\r
+  </Target>\r
+</Project>\r
index 0e947f4..0be176b 100644 (file)
     <ClCompile Include="..\..\..\src\autofit\autofit.c">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\bdf\bdf.c">\r
+    <ClCompile Include="..\..\..\src\base\ftbase.c">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\cff\cff.c">\r
+    <ClCompile Include="..\..\..\src\base\ftinit.c">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftbase.c">\r
+    <ClCompile Include="..\..\..\src\base\ftsystem.c">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftbitmap.c">\r
+    <ClCompile Include="..\..\..\src\bdf\bdf.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
+    <ClCompile Include="..\..\..\src\cff\cff.c">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftfstype.c">\r
+    <ClCompile Include="..\..\..\src\cid\type1cid.c">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftgasp.c">\r
+    <ClCompile Include="..\..\..\src\gzip\ftgzip.c">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftglyph.c">\r
+    <ClCompile Include="..\..\..\src\lzw\ftlzw.c">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\gzip\ftgzip.c">\r
+    <ClCompile Include="..\..\..\src\pfr\pfr.c">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftinit.c">\r
+    <ClCompile Include="..\..\..\src\pcf\pcf.c">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\lzw\ftlzw.c">\r
+    <ClCompile Include="..\..\..\src\psaux\psaux.c">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftstroke.c">\r
+    <ClCompile Include="..\..\..\src\pshinter\pshinter.c">\r
       <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftsystem.c">\r
+    <ClCompile Include="..\..\..\src\psnames\psmodule.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\raster\raster.c">\r
+      <Filter>Source Files</Filter>\r
+    </ClCompile>\r
+    <ClCompile Include="..\..\..\src\sfnt\sfnt.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 Include="..\..\..\src\truetype\truetype.c">\r
+      <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftfntfmt.c">\r
-      <Filter>Source Files\FT_MODULES</Filter>\r
+    <ClCompile Include="..\..\..\src\type1\type1.c">\r
+      <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftmm.c">\r
-      <Filter>Source Files\FT_MODULES</Filter>\r
+    <ClCompile Include="..\..\..\src\type42\type42.c">\r
+      <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftpfr.c">\r
-      <Filter>Source Files\FT_MODULES</Filter>\r
+    <ClCompile Include="..\..\..\src\winfonts\winfnt.c">\r
+      <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftsynth.c">\r
-      <Filter>Source Files\FT_MODULES</Filter>\r
+    <ClCompile Include="..\ftdebug.c">\r
+      <Filter>Source Files</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\fttype1.c">\r
+    <ClCompile Include="..\..\..\src\base\ftbbox.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftwinfnt.c">\r
+    <ClCompile Include="..\..\..\src\base\ftbdf.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftlcdfil.c">\r
+    <ClCompile Include="..\..\..\src\base\ftbitmap.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftgxval.c">\r
+    <ClCompile Include="..\..\..\src\base\ftcid.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftotval.c">\r
+    <ClCompile Include="..\..\..\src\base\ftfntfmt.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\base\ftpatent.c">\r
+    <ClCompile Include="..\..\..\src\base\ftfstype.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\pcf\pcf.c">\r
+    <ClCompile Include="..\..\..\src\base\ftgasp.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\pfr\pfr.c">\r
+    <ClCompile Include="..\..\..\src\base\ftglyph.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\psaux\psaux.c">\r
+    <ClCompile Include="..\..\..\src\base\ftgxval.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\pshinter\pshinter.c">\r
+    <ClCompile Include="..\..\..\src\base\ftlcdfil.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\psnames\psmodule.c">\r
+    <ClCompile Include="..\..\..\src\base\ftmm.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\raster\raster.c">\r
+    <ClCompile Include="..\..\..\src\base\ftotval.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\sfnt\sfnt.c">\r
+    <ClCompile Include="..\..\..\src\base\ftpatent.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\truetype\truetype.c">\r
+    <ClCompile Include="..\..\..\src\base\ftpfr.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\type1\type1.c">\r
+    <ClCompile Include="..\..\..\src\base\ftstroke.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\cid\type1cid.c">\r
+    <ClCompile Include="..\..\..\src\base\ftsynth.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\type42\type42.c">\r
+    <ClCompile Include="..\..\..\src\base\fttype1.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\..\src\winfonts\winfnt.c">\r
+    <ClCompile Include="..\..\..\src\base\ftwinfnt.c">\r
       <Filter>Source Files\FT_MODULES</Filter>\r
     </ClCompile>\r
   </ItemGroup>\r
index c2b5800..7433ce8 100644 (file)
 <p>This directory contains a project file for Visual C++ (VS.NET&nbsp;2010
 or newer), named <tt>freetype.vcxproj</tt>, and Visual Studio, called
 <tt>freetype.sln</tt>.  It compiles the following libraries from the
-FreeType 2.8 sources:</p>
+FreeType 2.9 sources:</p>
 
 <ul>
   <pre>
-    freetype28.lib    - release build
-    freetype28d.lib   - debug build
-    freetype28ST.lib  - release build; single threaded
-    freetype28STd.lib - debug build;   single threaded
-    freetype28MT.lib  - release build; multi-threaded
-    freetype28MTd.lib - debug build;   multi-threaded</pre>
+    freetype29.lib    - release build
+    freetype29d.lib   - debug build
+    freetype29ST.lib  - release build; single threaded
+    freetype29STd.lib - debug build;   single threaded
+    freetype29MT.lib  - release build; multi-threaded
+    freetype29MTd.lib - debug build;   multi-threaded</pre>
 </ul>
 
 <p>Both Win32 and x64 builds are supported.</p>
index fc14b48..76d6e91 100644 (file)
@@ -54,7 +54,7 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo\r
 LIB32=link.exe -lib\r
 # ADD BASE LIB32 /nologo\r
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype28.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype29.lib"\r
 \r
 !ELSEIF  "$(CFG)" == "freetype - Win32 Debug"\r
 \r
@@ -78,7 +78,7 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo\r
 LIB32=link.exe -lib\r
 # ADD BASE LIB32 /nologo\r
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype28_D.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype29_D.lib"\r
 \r
 !ELSEIF  "$(CFG)" == "freetype - Win32 Debug Multithreaded"\r
 \r
@@ -102,8 +102,8 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo\r
 # ADD BSC32 /nologo\r
 LIB32=link.exe -lib\r
-# ADD BASE LIB32 /nologo /out:"lib\freetype28_D.lib"\r
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype28MT_D.lib"\r
+# ADD BASE LIB32 /nologo /out:"lib\freetype29_D.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype29MT_D.lib"\r
 \r
 !ELSEIF  "$(CFG)" == "freetype - Win32 Release Multithreaded"\r
 \r
@@ -126,8 +126,8 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo\r
 # ADD BSC32 /nologo\r
 LIB32=link.exe -lib\r
-# ADD BASE LIB32 /nologo /out:"lib\freetype28.lib"\r
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype28MT.lib"\r
+# ADD BASE LIB32 /nologo /out:"lib\freetype29.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype29MT.lib"\r
 \r
 !ELSEIF  "$(CFG)" == "freetype - Win32 Release Singlethreaded"\r
 \r
@@ -151,8 +151,8 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo\r
 # ADD BSC32 /nologo\r
 LIB32=link.exe -lib\r
-# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype28.lib"\r
-# ADD LIB32 /out:"..\..\..\objs\freetype28ST.lib"\r
+# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype29.lib"\r
+# ADD LIB32 /out:"..\..\..\objs\freetype29ST.lib"\r
 # SUBTRACT LIB32 /nologo\r
 \r
 !ELSEIF  "$(CFG)" == "freetype - Win32 Debug Singlethreaded"\r
@@ -177,8 +177,8 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo\r
 # ADD BSC32 /nologo\r
 LIB32=link.exe -lib\r
-# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype28_D.lib"\r
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype28ST_D.lib"\r
+# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype29_D.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype29ST_D.lib"\r
 \r
 !ENDIF\r
 \r
@@ -226,10 +226,22 @@ SOURCE=..\..\..\src\base\ftbitmap.c
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\src\base\ftcid.c\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\src\base\ftfntfmt.c\r
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\src\base\ftlcdfil.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\src\base\ftpatent.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
index 968f2ee..6c0b761 100644 (file)
@@ -69,7 +69,7 @@
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\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\ftfntfmt.c"\r
                                        >\r
                                </File>\r
index e2f868c..32cebc6 100644 (file)
 
 <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.8 sources:</p>
+compiles the following libraries from the FreeType 2.9 sources:</p>
 
 <ul>
   <pre>
-    freetype28.lib     - release build; single threaded
-    freetype28_D.lib   - debug build;   single threaded
-    freetype28MT.lib   - release build; multi-threaded
-    freetype28MT_D.lib - debug build;   multi-threaded</pre>
+    freetype29.lib     - release build; single threaded
+    freetype29_D.lib   - debug build;   single threaded
+    freetype29MT.lib   - release build; multi-threaded
+    freetype29MT_D.lib - debug build;   multi-threaded</pre>
 </ul>
 
 <p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
index fc14b48..19d7c45 100644 (file)
@@ -54,7 +54,7 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo\r
 LIB32=link.exe -lib\r
 # ADD BASE LIB32 /nologo\r
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype28.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype29.lib"\r
 \r
 !ELSEIF  "$(CFG)" == "freetype - Win32 Debug"\r
 \r
@@ -78,7 +78,7 @@ BSC32=bscmake.exe
 # ADD BSC32 /nologo\r
 LIB32=link.exe -lib\r
 # ADD BASE LIB32 /nologo\r
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype28_D.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype29_D.lib"\r
 \r
 !ELSEIF  "$(CFG)" == "freetype - Win32 Debug Multithreaded"\r
 \r
@@ -102,8 +102,8 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo\r
 # ADD BSC32 /nologo\r
 LIB32=link.exe -lib\r
-# ADD BASE LIB32 /nologo /out:"lib\freetype28_D.lib"\r
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype28MT_D.lib"\r
+# ADD BASE LIB32 /nologo /out:"lib\freetype29_D.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype29MT_D.lib"\r
 \r
 !ELSEIF  "$(CFG)" == "freetype - Win32 Release Multithreaded"\r
 \r
@@ -126,8 +126,8 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo\r
 # ADD BSC32 /nologo\r
 LIB32=link.exe -lib\r
-# ADD BASE LIB32 /nologo /out:"lib\freetype28.lib"\r
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype28MT.lib"\r
+# ADD BASE LIB32 /nologo /out:"lib\freetype29.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype29MT.lib"\r
 \r
 !ELSEIF  "$(CFG)" == "freetype - Win32 Release Singlethreaded"\r
 \r
@@ -151,8 +151,8 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo\r
 # ADD BSC32 /nologo\r
 LIB32=link.exe -lib\r
-# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype28.lib"\r
-# ADD LIB32 /out:"..\..\..\objs\freetype28ST.lib"\r
+# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype29.lib"\r
+# ADD LIB32 /out:"..\..\..\objs\freetype29ST.lib"\r
 # SUBTRACT LIB32 /nologo\r
 \r
 !ELSEIF  "$(CFG)" == "freetype - Win32 Debug Singlethreaded"\r
@@ -177,8 +177,8 @@ BSC32=bscmake.exe
 # ADD BASE BSC32 /nologo\r
 # ADD BSC32 /nologo\r
 LIB32=link.exe -lib\r
-# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype28_D.lib"\r
-# ADD LIB32 /nologo /out:"..\..\..\objs\freetype28ST_D.lib"\r
+# ADD BASE LIB32 /nologo /out:"..\..\..\objs\freetype29_D.lib"\r
+# ADD LIB32 /nologo /out:"..\..\..\objs\freetype29ST_D.lib"\r
 \r
 !ENDIF\r
 \r
@@ -226,6 +226,10 @@ SOURCE=..\..\..\src\base\ftbitmap.c
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\src\base\ftcid.c\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\src\base\ftfntfmt.c\r
 # End Source File\r
 # Begin Source File\r
@@ -267,6 +271,10 @@ SOURCE=..\..\..\src\base\ftinit.c
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\src\base\ftlcdfil.c\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\src\lzw\ftlzw.c\r
 # End Source File\r
 # Begin Source File\r
@@ -280,6 +288,10 @@ SOURCE=..\..\..\src\base\ftotval.c
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\src\base\ftpatent.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
index f28b3c1..d08cd8e 100644 (file)
@@ -87,7 +87,7 @@
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28.lib"\r
+                               OutputFile="..\..\..\objs\freetype29.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST.lib"\r
                        />\r
                        <Tool\r
                                Name="VCALinkTool"\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28ST_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29ST_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\r
                        />\r
                        <Tool\r
                                Name="VCLibrarianTool"\r
-                               OutputFile="..\..\..\objs\freetype28MT_D.lib"\r
+                               OutputFile="..\..\..\objs\freetype29MT_D.lib"\r
                                SuppressStartupBanner="true"\r
                        />\r
                        <Tool\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\ftfntfmt.c"\r
                                        >\r
                                </File>\r
index 06107ae..3b3390a 100644 (file)
@@ -21,14 +21,14 @@ the following targets:
   <li>PPC/SP WM6 (Windows Mobile 6)</li>
 </ul>
 
-It compiles the following libraries from the FreeType 2.8 sources:</p>
+It compiles the following libraries from the FreeType 2.9 sources:</p>
 
 <ul>
   <pre>
-    freetype28.lib     - release build; single threaded
-    freetype28_D.lib   - debug build;   single threaded
-    freetype28MT.lib   - release build; multi-threaded
-    freetype28MT_D.lib - debug build;   multi-threaded</pre>
+    freetype29.lib     - release build; single threaded
+    freetype29_D.lib   - debug build;   single threaded
+    freetype29MT.lib   - release build; multi-threaded
+    freetype29MT_D.lib - debug build;   multi-threaded</pre>
 </ul>
 
 <p>Be sure to extract the files with the Windows (CR+LF) line endings.  ZIP
index d8d33b1..01aab1c 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index ea634e5..2c14d6c 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index c9b96e9..279d5f9 100644 (file)
@@ -5,7 +5,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 27a0a8f..9e3476b 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index c4f3dbf..e695c12 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 4442bd3..1e36662 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 0508fbb..5729d36 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index ae40823..b3a210d 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 922fc60..342c8aa 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 4d6138e..37ecc88 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index c9bebdb..f83d444 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 68dbd99..8ee0d40 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Copyright 2002-2017 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index c805cf9..1d17141 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType 2 build and setup macros (development version).             */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index db661e7..1b4619e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    User-selectable configuration macros (specification only).           */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -107,22 +107,19 @@ FT_BEGIN_HEADER
 
   /*************************************************************************/
   /*                                                                       */
-  /* 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.    */
+  /* Uncomment the line below if you want to activate LCD rendering        */
+  /* technology similar to ClearType in this build of the library.  This   */
+  /* technology triples the resolution in the direction color subpixels.   */
+  /* To mitigate color fringes inherent to this technology, you also need  */
+  /* to explicitly set up LCD filtering.                                   */
   /*                                                                       */
   /* Note that this feature is covered by several Microsoft patents        */
   /* and should not be activated in any default build of the library.      */
+  /* When this macro is not defined, FreeType offers alternative LCD       */
+  /* rendering technology that produces excellent output without LCD       */
+  /* filtering.                                                            */
   /*                                                                       */
-  /* 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
+/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
 
 
   /*************************************************************************/
@@ -273,48 +270,6 @@ FT_BEGIN_HEADER
 
   /*************************************************************************/
   /*                                                                       */
-  /* 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 */
@@ -327,7 +282,7 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /*   - The TrueType driver will provide its own set of glyph names,      */
   /*     if you build it to support postscript names in the TrueType       */
-  /*     `post' table.                                                     */
+  /*     `post' table, but will not synthesize a missing Unicode charmap.  */
   /*                                                                       */
   /*   - The Type 1 driver will not be able to synthesize a Unicode        */
   /*     charmap out of the glyphs found in the fonts.                     */
@@ -672,7 +627,7 @@ FT_BEGIN_HEADER
   /* This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be      */
   /* defined.                                                              */
   /*                                                                       */
-  /* [1] http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */
+  /* [1] https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */
   /*                                                                       */
 /* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING  1     */
 /* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING  2     */
@@ -692,7 +647,7 @@ FT_BEGIN_HEADER
   /* composite flags array which can be used to disambiguate, but old      */
   /* fonts will not have them.                                             */
   /*                                                                       */
-  /*   http://www.microsoft.com/typography/otspec/glyf.htm                 */
+  /*   https://www.microsoft.com/typography/otspec/glyf.htm                */
   /*   https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html */
   /*                                                                       */
 #undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
@@ -790,6 +745,16 @@ FT_BEGIN_HEADER
 
 
   /*************************************************************************/
+  /*                                                                       */
+  /* T1_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe Type 1     */
+  /* engine gets compiled into FreeType.  If defined, it is possible to    */
+  /* switch between the two engines using the `hinting-engine' property of */
+  /* the type1 driver module.                                              */
+  /*                                                                       */
+#define T1_CONFIG_OPTION_OLD_ENGINE
+
+
+  /*************************************************************************/
   /*************************************************************************/
   /****                                                                 ****/
   /****         C F F   D R I V E R    C O N F I G U R A T I O N        ****/
index 3ee9510..9901e10 100644 (file)
@@ -1,4 +1,176 @@
 
+CHANGES BETWEEN 2.8.1 and 2.9
+
+  I. IMPORTANT BUG FIXES
+
+    - Advance width values of variation fonts were often wrong.
+
+    - More fixes for variation font support; you should update to this
+      version if you want to support them.
+
+
+  II. IMPORTANT CHANGES
+
+    - As a GSoC project, Ewald Hew extended the new (Adobe) CFF engine
+      to  handle  Type  1  fonts  also,  thus  greatly  improving  the
+      rendering of  this format.   This is the  new default.   The old
+      engine   is  still   available   if   the  configuration   macro
+      `T1_CONFIG_OPTION_OLD_ENGINE'    gets    defined;   using    the
+      `hinting-engine' property  of the `type1' driver  module you can
+      then switch between the two engines.
+
+    - A new function,  `FT_Set_Named_Instance', can be used  to set or
+      change the current named instance.
+
+    - Starting  with   this  FreeType  version,   resetting  variation
+      coordinates  will   return  to  the  currently   selected  named
+      instance.  Previously, FreeType returned to the base font (i.e.,
+      no instance set).
+
+
+  III. MISCELLANEOUS
+
+    - The `face_flags' field of the `FT_Face' structure has a new bit,
+      `FT_FACE_FLAG_VARIATION', which  is set if a  variation font has
+      been      altered      with      `FT_Set_MM_Design_Coordinates',
+      `FT_Set_Var_Design_Coordinates',                              or
+      `FT_Set_Var_Blend_Coordinates'.
+
+    - If  the  current  face  is  a  named  instance,  the  new  macro
+      `FT_IS_NAMED_INSTANCE' returns true.
+
+    - `FT_IS_VARIATION' is  a new macro  that returns true  whenever a
+      face object has  been altered by `FT_Set_MM_Design_Coordinates',
+      `FT_Set_Var_Design_Coordinates',                              or
+      `FT_Set_Var_Blend_Coordinates'.
+
+    - Changing  the  design  coordinates  of  a  variation  font  with
+      `FT_Set_Var_Design_Coordinates'                               or
+      `FT_Set_Var_Blend_Coordinates'  does  not  influence  the  named
+      instance index value (only `FT_Set_Named_Instance' does that).
+
+    - Special PostScript  names for named instances  are only returned
+      if the  named instance is set  with `FT_Set_Named_Instance' (and
+      the font  has corresponding  entries in  its `fvar'  table).  If
+      `FT_IS_VARIATION'  returns  true,  the  algorithmically  derived
+      PostScript name is provided, not  looking up special entries for
+      named instances.
+
+    - A new function  `FT_Done_MM_Var' is provided to  free the memory
+      returned in a call to `FT_Get_MM_Var'.
+
+    - On  platforms  using  the   `configure'  script,  the  installed
+      `ftoption.h' file  now correctly reflects  configuration options
+      like `--with-harfbuzz'.
+
+    - Better  support to  build FreeType  as  a DLL  on Windows  using
+      Visual C.
+
+    - All data specific to driver modules is now collected in a single
+      file,      `FT_DRIVER_H'.      Consequently,      the     macros
+      `FT_AUTOHINTER_H',   `FT_CFF_DRIVER_H',  `FT_TRUETYPE_DRIVER_H',
+      and `FT_PCF_DRIVER_H' still work but are deprecated.
+
+    - Some fuzzer fixes to better reject malformed fonts.
+
+    - The `ftbench' demo program has a new test for opening a new face
+      and loading some glyphs.
+
+    - The `ftbench' demo program has a  new option `-j' to specify the
+      last glyph index to be used in the tests.
+
+    - The  `ftgrid' demo  program has  a new  option `-n'  to suppress
+      display of named instances of variation fonts.
+
+    - The `ttdebug' demo program can now  show a stack trace (key `K')
+      and switch  between hexadecimal and decimal  display of integers
+      (key `I').
+
+======================================================================
+
+CHANGES BETWEEN 2.8 and 2.8.1
+
+  I. IMPORTANT BUG FIXES
+
+    - B/W  hinting   of  TrueType   fonts  didn't  work   properly  if
+      interpreter version 38 or 40 was selected.
+
+    - Some severe  problems within the handling  of TrueType Variation
+      Fonts were found and fixed.
+
+    - Function `FT_Set_Var_Design_Coordinates' didn't correctly handle
+      the case with less input coordinates than axes.
+
+
+  II. IMPORTANT CHANGES
+
+    - By  default,  FreeType  now offers  high  quality  LCD-optimized
+      output without  resorting to ClearType techniques  of resolution
+      tripling and  filtering.  In  this method, called  Harmony, each
+      color channel  is generated separately after  shifting the glyph
+      outline, capitalizing  on the fact  that the color grids  on LCD
+      panels  are shifted  by  a third  of a  pixel.   This output  is
+      indistinguishable from ClearType with a light 3-tap filter.
+
+
+  III. MISCELLANEOUS
+
+    - Using the  new function `FT_Get_Var_Axis_Flags',  an application
+      can access the `flags' field  of a variation axis (introduced in
+      OpenType version 1.8.2)
+
+    - More sanity checks.
+
+    - The  internal representation  of buffers  for LCD  rendering has
+      changed (to be more precise, the amount of padding gets computed
+      differently).  Applications  that use  the FreeType API  are not
+      affected.
+
+    - To  reset all  design axis  values of  a variation  font to  its
+      default values you can now say
+
+        error = FT_Set_Var_Design_Coordinates( face, 0, NULL );
+
+      This  also works  with functions  `FT_Set_MM_Design_Coordinates'
+      and `FT_Set_MM_Blend_Coordinates'.
+
+    - FreeType  now synthesizes  a  missing Unicode  cmap for  (older)
+      TrueType fonts also if glyph names are available.
+
+    - FreeType  has  improved  handling   of  BDF  fonts  without  the
+      `POINT_SIZE', `RESOLUTION_X', or  `RESOLUTION_Y' properties; the
+      library now  uses the values of  the `SIZE' keyword if  they are
+      missing.   Previously,   `SIZE'  was  completely   ignored,  and
+      FreeType used heuristic values instead.
+
+    - Multiple calls to `FT_Bitmap_Convert' do work now as advertised.
+      Previously,  they failed with an assertion error if there was an
+      empty bitmap between non-empty ones.
+
+    - The warping option  has moved  from `light'  to `normal' hinting
+      where  it replaces  the original hinting algorithm.  The `light'
+      mode is now always void of any hinting in x-direction.
+
+    - 16bit  compiler  support is  now  officially  ended.  We  didn't
+      provide any maintenance  since many years,  and given that there
+      were no error  or problem reports either it seems  that it is no
+      longer needed.
+
+    - The `ftgrid'  demo program  can now toggle  the display  of grid
+      lines with the `G' key.
+
+    - The `ftgrid' demo  program can toggle a different  set of colors
+      (suitable to color-blind people) with the `C' key.
+
+    - The `ftgrid'  demo program  now supports  the `-e'  command line
+      option to select a cmap.
+
+    - The `ftdump' demo program has a  new command line option `-t' to
+      output the SFNT table list.
+
+
+======================================================================
+
 CHANGES BETWEEN 2.7.1 and 2.8
 
   I. IMPORTANT CHANGES
@@ -44,6 +216,20 @@ CHANGES BETWEEN 2.7.1 and 2.8
       configuration option.   However, it  is strongly  recommended to
       avoid that, adjusting font sizes instead.
 
+    - Global size  metrics values  in the  `FT_Size_Metrics' structure
+      can be  different for TrueType  fonts.  Reason is that  in older
+      FreeType  versions  the  metrics  were  rounded  differently  to
+      integer pixels compared  to all other font  formats, yielding an
+      inconsistent behaviour if you used non-native hinting.  Starting
+      with this  version, global size  metrics for TrueType  fonts are
+      handled the same as other  font formats: `ascender' gets rounded
+      up,  `descender'  gets  rounded  down,  `height'  gets  normally
+      rounded, and `max_advance' gets normally rounded, too.
+
+      If you need more precise values of (global) ascender, descender,
+      height, or  `max_advance', please take the  corresponding values
+      from the `FT_Face' structure and scale them manually.
+
     - If a TrueType font gets loaded with FT_LOAD_NO_HINTING, FreeType
       now scales  the font linearly  again (bug introduced  in version
       2.4.6).
@@ -129,7 +315,7 @@ CHANGES BETWEEN 2.7 and 2.7.1
       write caused by a heap-based  buffer overflow related to the CFF
       fonts.
 
-        http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10328
+        https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10328
 
 
   III. MISCELLANEOUS
@@ -644,7 +830,7 @@ CHANGES BETWEEN 2.5.3 and 2.5.4
   I. IMPORTANT BUG FIXES
 
     - A   variant  of   vulnerability  CVE-2014-2240   was  identified
-      (cf.  http://savannah.nongnu.org/bugs/?43661) and  fixed in  the
+      (cf.  https://savannah.nongnu.org/bugs/?43661) and  fixed in the
       new CFF driver.  All users should upgrade.
 
     - The new auto-hinter code using HarfBuzz crashed for some invalid
@@ -715,7 +901,7 @@ CHANGES BETWEEN 2.5.2 and 2.5.3
   I. IMPORTANT BUG FIXES
 
     - A vulnerability (CVE-2014-2240) was  identified and fixed in the
-      new  CFF  driver  (cf.  http://savannah.nongnu.org/bugs/?41697).
+      new  CFF driver  (cf.  https://savannah.nongnu.org/bugs/?41697).
       All users should upgrade.
 
     - More  bug  fixes related  to  correct  positioning of  composite
@@ -748,7 +934,7 @@ CHANGES BETWEEN 2.5.2 and 2.5.3
            and install FreeType again.
 
       With FreeType's  `configure' script the procedure  boils down to
-      configure, build, and install Freetype, then configure, compile,
+      configure, build, and install FreeType, then configure, compile,
       and  install  HarfBuzz,  then configure,  compile,  and  install
       FreeType again (after executing `make distclean').
 
@@ -1087,7 +1273,7 @@ CHANGES BETWEEN 2.4.10 and 2.4.11
     - Subpixel  hinting support  has been  contributed by  Infinality,
       based on Greg Hitchcock's whitepaper at
 
-        http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
+        https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx
 
       Originally, it was a separate patch available from
 
@@ -1957,7 +2143,7 @@ CHANGES BETWEEN 2.3.0 and 2.2.1
       of  the  library,  mainly   due  to  patent  issues.   For  more
       information see:
 
-      http://lists.gnu.org/archive/html/freetype/2006-09/msg00064.html
+      https://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
@@ -2060,7 +2246,7 @@ CHANGES BETWEEN 2.2 and 2.1.10
       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
+        https://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
@@ -2172,7 +2358,7 @@ CHANGES BETWEEN 2.2 and 2.1.10
 
     - Rudimentary support for Adobe's new `SING Glyphlet' format.  See
 
-        http://www.adobe.com/products/indesign/sing_gaiji.html
+        https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5148.SING_Tutorial.pdf
 
       for more information.
 
@@ -2849,7 +3035,7 @@ CHANGES BETWEEN 2.1.3 and 2.1.2
       quality since  many nasty defaults have been suppressed.  Please
       visit the web page:
 
-        http://www.freetype.org/hinting/smooth-hinting.html
+        https://www.freetype.org/hinting/smooth-hinting.html
 
       for additional details on this topic.
 
@@ -3108,7 +3294,7 @@ CHANGES BETWEEN 2.1.0 and 2.0.9
     - The  FreeType 2  redesign has  begun.  More  information  can be
       found at this URL:
 
-        http://www.freetype.org/freetype2/redesign.html
+        https://www.freetype.org/freetype2/redesign.html
 
       The following  internal changes  have been performed  within the
       sources of this release:
@@ -3699,13 +3885,7 @@ CHANGES BETWEEN 2.0.2 and 2.0.1
 
       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
+        https://www.freetype.org/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
@@ -3714,7 +3894,7 @@ CHANGES BETWEEN 2.0.2 and 2.0.1
       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
+        https://www.freetype.org/freetype2/docs/reference/ft2-toc.html
 
 
   III. CHANGES TO THE BUILD PROCESS
@@ -4789,7 +4969,7 @@ Extensions support:
 
 ------------------------------------------------------------------------
 
-Copyright 2000-2017 by
+Copyright 2000-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file  is  part  of the  FreeType  project, and may  only be  used,
index 6d1587e..916be32 100644 (file)
@@ -139,7 +139,7 @@ IV. Overriding default configuration and module headers
 
 ----------------------------------------------------------------------
 
-Copyright 2003-2017 by
+Copyright 2003-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
index e5e9390..751eaf0 100644 (file)
@@ -191,7 +191,7 @@ behaviour of FreeType at runtime.
 
 ------------------------------------------------------------------------
 
-Copyright 2002-2017 by
+Copyright 2002-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part  of the  FreeType  project, and  may  only be  used,
index 433ab06..c406d15 100644 (file)
@@ -163,7 +163,7 @@ Legal Terms
 
   Our home page can be found at
 
-    http://www.freetype.org
+    https://www.freetype.org
 
 
 --- end of FTL.TXT ---
index d6ec0d8..fc24ea1 100644 (file)
@@ -77,7 +77,7 @@ II. Custom builds of the library
 
 ----------------------------------------------------------------------
 
-Copyright 2000-2017 by
+Copyright 2000-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
index 30b9578..47d080f 100644 (file)
@@ -143,7 +143,7 @@ II. Support for flat-directory compilation
 
 ----------------------------------------------------------------------
 
-Copyright 2003-2017 by
+Copyright 2003-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
index 1a837ae..e8977a1 100644 (file)
@@ -163,7 +163,7 @@ procedure.
 
 ----------------------------------------------------------------------
 
-Copyright 2006-2017 by
+Copyright 2006-2018 by
 suzuki toshiya, David Turner, Robert Wilhelm, and Werner Lemberg.
 
 
index 79b53d8..52645f1 100644 (file)
@@ -148,7 +148,7 @@ instructions in the file `INSTALL.UNIX' instead.
 
 ----------------------------------------------------------------------
 
-Copyright 2003-2017 by
+Copyright 2003-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
index 8b620da..bb57836 100644 (file)
@@ -105,7 +105,7 @@ or MSys on Win32:
 
 ----------------------------------------------------------------------
 
-Copyright 2003-2017 by
+Copyright 2003-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
index 7a5174d..c1d30e0 100644 (file)
@@ -1,7 +1,7 @@
-How to build the freetype2 library on VMS
+How to build the FreeType 2 library on VMS
 -----------------------------------------
 
-It is actually very  straightforward to install the Freetype2 library.
+It is actually very straightforward to install the FreeType 2 library.
 Just  execute vms_make.com from  the toplevel  directory to  build the
 library.  This procedure currently accepts the following options:
 
@@ -15,10 +15,10 @@ 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.
+sharing the same top level  as the directory of FreeType 2  and follow
+the same instructions as above for  the demos from  there.  The  build
+process relies on this  to figure out  the location  of the FreeType 2
+include files.
 
 
 To rebuild  the  sources it is necessary to  have MMS/MMK installed on
@@ -49,7 +49,7 @@ V7.2-1.
 
 ------------------------------------------------------------------------
 
-Copyright 2000-2017 by
+Copyright 2000-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file  is  part  of the  FreeType  project, and may  only be  used,
index c4304b3..1a443a2 100644 (file)
--- a/docs/TODO
+++ b/docs/TODO
@@ -27,7 +27,7 @@ Other bugs have been registered at the savannah bugzilla of FreeType.
 
 ------------------------------------------------------------------------
 
-Copyright 2001-2017 by
+Copyright 2001-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file  is  part  of the  FreeType  project, and may  only be  used,
index e116d34..b0d25b5 100644 (file)
@@ -52,6 +52,8 @@ on _most_ systems, but not all of them:
 
     release     libtool     so
   -------------------------------
+     2.9.0      22.0.16   6.16.0
+     2.8.1      21.0.15   6.15.0
      2.8.0      20.0.14   6.14.0
      2.7.1      19.0.13   6.13.0
      2.7.0      18.6.12   6.12.6
@@ -99,7 +101,7 @@ other release numbers.
 #include <ft2build.h>
 #include FT_FREETYPE_H
 #if (FREETYPE_MAJOR*1000 + FREETYPE_MINOR)*1000 + FREETYPE_PATCH < 2000009
-#error Freetype version too low.
+#error FreeType version too low.
 #endif
   ],
   [AC_MSG_RESULT(yes)
@@ -111,7 +113,7 @@ other release numbers.
 
 ------------------------------------------------------------------------
 
-Copyright 2002-2017 by
+Copyright 2002-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part  of the  FreeType  project, and  may  only be  used,
index 1c494f0..75aba92 100644 (file)
@@ -155,10 +155,11 @@ which isn't supported yet please send a mail too.
 [1] Support should  be rather simple since this is  identical to `CFF'
     but in a PS wrapper.
 
-[2] Official PFR specification:
+[2] The  official  PFR  specification  is  no  longer  available,  but
+    archive.org has archived it:
 
-      http://www.bitstream.com/categories/developer/truedoc/pfrspec.html
-      http://www.bitstream.com/categories/developer/truedoc/pfrspec1.2.pdf
+      https://web.archive.org/web/20091014062300/http://www.bitstream.com/font_rendering/products/truedoc/pfrspec.html
+      https://web.archive.org/web/20081115152605/http://www.bitstream.com/font_rendering/pdfs/pfrspec1.3.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)
@@ -167,8 +168,6 @@ which isn't supported yet please send a mail too.
       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 or  data are  not
     loaded yet.
 
@@ -184,15 +183,15 @@ which isn't supported yet please send a mail too.
     George Williams deduced  the font format from the  X11 sources and
     documented it for his FontForge font editor:
 
-      http://fontforge.github.io/pcf-format.html
+      https://fontforge.github.io/pcf-format.html
 
 [5] This is from MS Windows 3; see Microsoft's Knowledge Base article at
 
-      http://support.microsoft.com/kb/65123
+      https://support.microsoft.com/kb/65123
 
 ------------------------------------------------------------------------
 
-Copyright 2004-2017 by
+Copyright 2004-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part  of the  FreeType  project, and  may  only be  used,
index eaaa1b9..e060dcb 100644 (file)
@@ -1,4 +1,4 @@
-.TH FREETYPE-CONFIG 1 "May 2017" "FreeType 2.8"
+.TH FREETYPE-CONFIG 1 "January 2018" "FreeType 2.9"
 .
 .
 .SH NAME
index bd3fd00..8ef466e 100644 (file)
@@ -618,7 +618,7 @@ II. Rendering Technology
 
 ------------------------------------------------------------------------
 
-Copyright 2003-2017 by
+Copyright 2003-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file  is  part  of the  FreeType  project, and may  only be  used,
index f1770f8..5e0eada 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="auto_hinter">The auto-hinter</h1>
-<h2>Synopsis</h2>
-<table class="synopsis">
-<tr><td><a href="#glyph-to-script-map">glyph-to-script-map</a></td><td><a href="#FT_Prop_IncreaseXHeight">FT_Prop_IncreaseXHeight</a></td></tr>
-<tr><td><a href="#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_XXX</a></td><td><a href="#warping">warping</a></td></tr>
-<tr><td><a href="#FT_Prop_GlyphToScriptMap">FT_Prop_GlyphToScriptMap</a></td><td><a href="#no-stem-darkening(autofit)">no-stem-darkening</a></td></tr>
-<tr><td><a href="#fallback-script">fallback-script</a></td><td><a href="#FT_PARAM_TAG_STEM_DARKENING">FT_PARAM_TAG_STEM_DARKENING</a></td></tr>
-<tr><td><a href="#default-script">default-script</a></td><td><a href="#darkening-parameters(autofit)">darkening-parameters</a></td></tr>
-<tr><td><a href="#increase-x-height">increase-x-height</a></td><td></td></tr>
-</table>
-
 
 <p>While FreeType's auto-hinter doesn't expose API functions by itself, it is possible to control its behaviour with <a href="ft2-module_management.html#FT_Property_Set">FT_Property_Set</a> and <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a>. The following lists the available properties together with the necessary macros and structures.</p>
 <p>Note that the auto-hinter's module name is &lsquo;autofitter&rsquo; for historical reasons.</p>
-
-<div class="section">
-<h3 id="glyph-to-script-map">glyph-to-script-map</h3>
-
-<p><b>Experimental</b> <b>only</b></p>
-<p>The auto-hinter provides various script modules to hint glyphs. Examples of supported scripts are Latin or CJK. Before a glyph is auto-hinted, the Unicode character map of the font gets examined, and the script is then determined based on Unicode character ranges, see below.</p>
-<p>OpenType fonts, however, often provide much more glyphs than character codes (small caps, superscripts, ligatures, swashes, etc.), to be controlled by so-called &lsquo;features&rsquo;. Handling OpenType features can be quite complicated and thus needs a separate library on top of FreeType.</p>
-<p>The mapping between glyph indices and scripts (in the auto-hinter sense, see the <a href="ft2-auto_hinter.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_XXX</a> values) is stored as an array with &lsquo;num_glyphs&rsquo; elements, as found in the font's <a href="ft2-base_interface.html#FT_Face">FT_Face</a> structure. The &lsquo;glyph-to-script-map&rsquo; property returns a pointer to this array, which can be modified as needed. Note that the modification should happen before the first glyph gets processed by the auto-hinter so that the global analysis of the font shapes actually uses the modified mapping.</p>
-<p>The following example code demonstrates how to access it (omitting the error handling).</p>
-<pre class="colored">
-  FT_Library                library;
-  FT_Face                   face;
-  FT_Prop_GlyphToScriptMap  prop;
-
-
-  FT_Init_FreeType( &amp;library );
-  FT_New_Face( library, "foo.ttf", 0, &amp;face );
-
-  prop.face = face;
-
-  FT_Property_Get( library, "autofitter",
-                            "glyph-to-script-map", &amp;prop );
-
-  // adjust `prop.map' as needed right here
-
-  FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );
-</pre>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_XXX</h3>
-<p>Defined in FT_AUTOHINTER_H (freetype/ftautoh.h).</p>
-<pre>
-#define <a href="ft2-auto_hinter.html#FT_AUTOHINTER_SCRIPT_NONE">FT_AUTOHINTER_SCRIPT_NONE</a>   0
-#define <a href="ft2-auto_hinter.html#FT_AUTOHINTER_SCRIPT_LATIN">FT_AUTOHINTER_SCRIPT_LATIN</a>  1
-#define <a href="ft2-auto_hinter.html#FT_AUTOHINTER_SCRIPT_CJK">FT_AUTOHINTER_SCRIPT_CJK</a>    2
-#define <a href="ft2-auto_hinter.html#FT_AUTOHINTER_SCRIPT_INDIC">FT_AUTOHINTER_SCRIPT_INDIC</a>  3
-</pre>
-
-<p><b>Experimental</b> <b>only</b></p>
-<p>A list of constants used for the <a href="ft2-auto_hinter.html#glyph-to-script-map">glyph-to-script-map</a> property to specify the script submodule the auto-hinter should use for hinting a particular glyph.</p>
-
-<h4>values</h4>
-<table class="fields">
-<tr><td class="val" id="FT_AUTOHINTER_SCRIPT_NONE">FT_AUTOHINTER_SCRIPT_NONE</td><td class="desc">
-<p>Don't auto-hint this glyph.</p>
-</td></tr>
-<tr><td class="val" id="FT_AUTOHINTER_SCRIPT_LATIN">FT_AUTOHINTER_SCRIPT_LATIN</td><td class="desc">
-<p>Apply the latin auto-hinter. For the auto-hinter, &lsquo;latin&rsquo; is a very broad term, including Cyrillic and Greek also since characters from those scripts share the same design constraints.</p>
-<p>By default, characters from the following Unicode ranges are assigned to this submodule.</p>
-<pre class="colored">
-  U+0020 - U+007F  // Basic Latin (no control characters)
-  U+00A0 - U+00FF  // Latin-1 Supplement (no control characters)
-  U+0100 - U+017F  // Latin Extended-A
-  U+0180 - U+024F  // Latin Extended-B
-  U+0250 - U+02AF  // IPA Extensions
-  U+02B0 - U+02FF  // Spacing Modifier Letters
-  U+0300 - U+036F  // Combining Diacritical Marks
-  U+0370 - U+03FF  // Greek and Coptic
-  U+0400 - U+04FF  // Cyrillic
-  U+0500 - U+052F  // Cyrillic Supplement
-  U+1D00 - U+1D7F  // Phonetic Extensions
-  U+1D80 - U+1DBF  // Phonetic Extensions Supplement
-  U+1DC0 - U+1DFF  // Combining Diacritical Marks Supplement
-  U+1E00 - U+1EFF  // Latin Extended Additional
-  U+1F00 - U+1FFF  // Greek Extended
-  U+2000 - U+206F  // General Punctuation
-  U+2070 - U+209F  // Superscripts and Subscripts
-  U+20A0 - U+20CF  // Currency Symbols
-  U+2150 - U+218F  // Number Forms
-  U+2460 - U+24FF  // Enclosed Alphanumerics
-  U+2C60 - U+2C7F  // Latin Extended-C
-  U+2DE0 - U+2DFF  // Cyrillic Extended-A
-  U+2E00 - U+2E7F  // Supplemental Punctuation
-  U+A640 - U+A69F  // Cyrillic Extended-B
-  U+A720 - U+A7FF  // Latin Extended-D
-  U+FB00 - U+FB06  // Alphab. Present. Forms (Latin Ligatures)
- U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols
- U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement
-</pre>
-<p></p>
-</td></tr>
-<tr><td class="val" id="FT_AUTOHINTER_SCRIPT_CJK">FT_AUTOHINTER_SCRIPT_CJK</td><td class="desc">
-<p>Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old Vietnamese, and some other scripts.</p>
-<p>By default, characters from the following Unicode ranges are assigned to this submodule.</p>
-<pre class="colored">
-  U+1100 - U+11FF  // Hangul Jamo
-  U+2E80 - U+2EFF  // CJK Radicals Supplement
-  U+2F00 - U+2FDF  // Kangxi Radicals
-  U+2FF0 - U+2FFF  // Ideographic Description Characters
-  U+3000 - U+303F  // CJK Symbols and Punctuation
-  U+3040 - U+309F  // Hiragana
-  U+30A0 - U+30FF  // Katakana
-  U+3100 - U+312F  // Bopomofo
-  U+3130 - U+318F  // Hangul Compatibility Jamo
-  U+3190 - U+319F  // Kanbun
-  U+31A0 - U+31BF  // Bopomofo Extended
-  U+31C0 - U+31EF  // CJK Strokes
-  U+31F0 - U+31FF  // Katakana Phonetic Extensions
-  U+3200 - U+32FF  // Enclosed CJK Letters and Months
-  U+3300 - U+33FF  // CJK Compatibility
-  U+3400 - U+4DBF  // CJK Unified Ideographs Extension A
-  U+4DC0 - U+4DFF  // Yijing Hexagram Symbols
-  U+4E00 - U+9FFF  // CJK Unified Ideographs
-  U+A960 - U+A97F  // Hangul Jamo Extended-A
-  U+AC00 - U+D7AF  // Hangul Syllables
-  U+D7B0 - U+D7FF  // Hangul Jamo Extended-B
-  U+F900 - U+FAFF  // CJK Compatibility Ideographs
-  U+FE10 - U+FE1F  // Vertical forms
-  U+FE30 - U+FE4F  // CJK Compatibility Forms
-  U+FF00 - U+FFEF  // Halfwidth and Fullwidth Forms
- U+1B000 - U+1B0FF // Kana Supplement
- U+1D300 - U+1D35F // Tai Xuan Hing Symbols
- U+1F200 - U+1F2FF // Enclosed Ideographic Supplement
- U+20000 - U+2A6DF // CJK Unified Ideographs Extension B
- U+2A700 - U+2B73F // CJK Unified Ideographs Extension C
- U+2B740 - U+2B81F // CJK Unified Ideographs Extension D
- U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement
-</pre>
-<p></p>
-</td></tr>
-<tr><td class="val" id="FT_AUTOHINTER_SCRIPT_INDIC">FT_AUTOHINTER_SCRIPT_INDIC</td><td class="desc">
-<p>Apply the indic auto-hinter, covering all major scripts from the Indian sub-continent and some other related scripts like Thai, Lao, or Tibetan.</p>
-<p>By default, characters from the following Unicode ranges are assigned to this submodule.</p>
-<pre class="colored">
-  U+0900 - U+0DFF  // Indic Range
-  U+0F00 - U+0FFF  // Tibetan
-  U+1900 - U+194F  // Limbu
-  U+1B80 - U+1BBF  // Sundanese
-  U+A800 - U+A82F  // Syloti Nagri
-  U+ABC0 - U+ABFF  // Meetei Mayek
- U+11800 - U+118DF // Sharada
-</pre>
-<p>Note that currently Indic support is rudimentary only, missing blue zone support.</p>
-</td></tr>
-</table>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="FT_Prop_GlyphToScriptMap">FT_Prop_GlyphToScriptMap</h3>
-<p>Defined in FT_AUTOHINTER_H (freetype/ftautoh.h).</p>
-<pre>
-  <span class="keyword">typedef</span> <span class="keyword">struct</span>  FT_Prop_GlyphToScriptMap_
-  {
-    <a href="ft2-base_interface.html#FT_Face">FT_Face</a>     face;
-    <a href="ft2-basic_types.html#FT_UShort">FT_UShort</a>*  map;
-
-  } <b>FT_Prop_GlyphToScriptMap</b>;
-</pre>
-
-<p><b>Experimental</b> <b>only</b></p>
-<p>The data exchange structure for the <a href="ft2-auto_hinter.html#glyph-to-script-map">glyph-to-script-map</a> property.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="fallback-script">fallback-script</h3>
-
-<p><b>Experimental</b> <b>only</b></p>
-<p>If no auto-hinter script module can be assigned to a glyph, a fallback script gets assigned to it (see also the <a href="ft2-auto_hinter.html#glyph-to-script-map">glyph-to-script-map</a> property). By default, this is <a href="ft2-auto_hinter.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_CJK</a>. Using the &lsquo;fallback-script&rsquo; property, this fallback value can be changed.</p>
-<pre class="colored">
-  FT_Library  library;
-  FT_UInt     fallback_script = FT_AUTOHINTER_SCRIPT_NONE;
-
-
-  FT_Init_FreeType( &amp;library );
-
-  FT_Property_Set( library, "autofitter",
-                            "fallback-script", &amp;fallback_script );
-</pre>
-
-<h4>note</h4>
-<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
-<p>It's important to use the right timing for changing this value: The creation of the glyph-to-script map that eventually uses the fallback script value gets triggered either by setting or reading a face-specific property like <a href="ft2-auto_hinter.html#glyph-to-script-map">glyph-to-script-map</a>, or by auto-hinting any glyph from that face. In particular, if you have already created an <a href="ft2-base_interface.html#FT_Face">FT_Face</a> structure but not loaded any glyph (using the auto-hinter), a change of the fallback script will affect this face.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="default-script">default-script</h3>
-
-<p><b>Experimental</b> <b>only</b></p>
-<p>If FreeType gets compiled with FT_CONFIG_OPTION_USE_HARFBUZZ to make the HarfBuzz library access OpenType features for getting better glyph coverages, this property sets the (auto-fitter) script to be used for the default (OpenType) script data of a font's GSUB table. Features for the default script are intended for all scripts not explicitly handled in GSUB; an example is a &lsquo;dlig&rsquo; feature, containing the combination of the characters &lsquo;T&rsquo;, &lsquo;E&rsquo;, and &lsquo;L&rsquo; to form a &lsquo;TEL&rsquo; ligature.</p>
-<p>By default, this is <a href="ft2-auto_hinter.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_LATIN</a>. Using the &lsquo;default-script&rsquo; property, this default value can be changed.</p>
-<pre class="colored">
-  FT_Library  library;
-  FT_UInt     default_script = FT_AUTOHINTER_SCRIPT_NONE;
-
-
-  FT_Init_FreeType( &amp;library );
-
-  FT_Property_Set( library, "autofitter",
-                            "default-script", &amp;default_script );
-</pre>
-
-<h4>note</h4>
-<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
-<p>It's important to use the right timing for changing this value: The creation of the glyph-to-script map that eventually uses the default script value gets triggered either by setting or reading a face-specific property like <a href="ft2-auto_hinter.html#glyph-to-script-map">glyph-to-script-map</a>, or by auto-hinting any glyph from that face. In particular, if you have already created an <a href="ft2-base_interface.html#FT_Face">FT_Face</a> structure but not loaded any glyph (using the auto-hinter), a change of the default script will affect this face.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="increase-x-height">increase-x-height</h3>
-
-<p>For ppem values in the range 6&nbsp;&lt;= ppem &lt;= &lsquo;increase-x-height&rsquo;, round up the font's x&nbsp;height much more often than normally. If the value is set to&nbsp;0, which is the default, this feature is switched off. Use this property to improve the legibility of small font sizes if necessary.</p>
-<pre class="colored">
-  FT_Library               library;
-  FT_Face                  face;
-  FT_Prop_IncreaseXHeight  prop;
-
-
-  FT_Init_FreeType( &amp;library );
-  FT_New_Face( library, "foo.ttf", 0, &amp;face );
-  FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );
-
-  prop.face  = face;
-  prop.limit = 14;
-
-  FT_Property_Set( library, "autofitter",
-                            "increase-x-height", &amp;prop );
-</pre>
-
-<h4>note</h4>
-<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
-<p>Set this value right after calling <a href="ft2-base_interface.html#FT_Set_Char_Size">FT_Set_Char_Size</a>, but before loading any glyph (using the auto-hinter).</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="FT_Prop_IncreaseXHeight">FT_Prop_IncreaseXHeight</h3>
-<p>Defined in FT_AUTOHINTER_H (freetype/ftautoh.h).</p>
-<pre>
-  <span class="keyword">typedef</span> <span class="keyword">struct</span>  FT_Prop_IncreaseXHeight_
-  {
-    <a href="ft2-base_interface.html#FT_Face">FT_Face</a>  face;
-    <a href="ft2-basic_types.html#FT_UInt">FT_UInt</a>  limit;
-
-  } <b>FT_Prop_IncreaseXHeight</b>;
-</pre>
-
-<p>The data exchange structure for the <a href="ft2-auto_hinter.html#increase-x-height">increase-x-height</a> property.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="warping">warping</h3>
-
-<p><b>Experimental</b> <b>only</b></p>
-<p>If FreeType gets compiled with option AF_CONFIG_OPTION_USE_WARPER to activate the warp hinting code in the auto-hinter, this property switches warping on and off.</p>
-<p>Warping only works in &lsquo;light&rsquo; auto-hinting mode. The idea of the code is to slightly scale and shift a glyph along the non-hinted dimension (which is usually the horizontal axis) so that as much of its segments are aligned (more or less) to the grid. To find out a glyph's optimal scaling and shifting value, various parameter combinations are tried and scored.</p>
-<p>By default, warping is off. The example below shows how to switch on warping (omitting the error handling).</p>
-<pre class="colored">
-  FT_Library  library;
-  FT_Bool     warping = 1;
-
-
-  FT_Init_FreeType( &amp;library );
-
-  FT_Property_Set( library, "autofitter",
-                            "warping", &amp;warping );
-</pre>
-
-<h4>note</h4>
-<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
-<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable (using values 1 and 0 for &lsquo;on&rsquo; and &lsquo;off&rsquo;, respectively).</p>
-<p>The warping code can also change advance widths. Have a look at the &lsquo;lsb_delta&rsquo; and &lsquo;rsb_delta&rsquo; fields in the <a href="ft2-base_interface.html#FT_GlyphSlotRec">FT_GlyphSlotRec</a> structure for details on improving inter-glyph distances while rendering.</p>
-<p>Since warping is a global property of the auto-hinter it is best to change its value before rendering any face. Otherwise, you should reload all faces that get auto-hinted in &lsquo;light&rsquo; hinting mode.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="no-stem-darkening(autofit)">no-stem-darkening</h3>
-
-<p><b>Experimental</b> <b>only</b>, <b>requires</b> <b>linear</b> <b>alpha</b> <b>blending</b> <b>and</b> <b>gamma</b> <b>correction</b></p>
-<p>Stem darkening emboldens glyphs at smaller sizes to make them more readable on common low-DPI screens when using linear alpha blending and gamma correction, see <a href="ft2-base_interface.html#FT_Render_Glyph">FT_Render_Glyph</a>. When not using linear alpha blending and gamma correction, glyphs will appear heavy and fuzzy!</p>
-<p>Gamma correction essentially lightens fonts since shades of grey are shifted to higher pixel values (=&nbsp;higher brightness) to match the original intention to the reality of our screens. The side-effect is that glyphs &lsquo;thin out&rsquo;. Mac OS&nbsp;X and Adobe's proprietary font rendering library implement a counter-measure: stem darkening at smaller sizes where shades of gray dominate. By emboldening a glyph slightly in relation to its pixel size, individual pixels get higher coverage of filled-in outlines and are therefore &lsquo;blacker&rsquo;. This counteracts the &lsquo;thinning out&rsquo; of glyphs, making text remain readable at smaller sizes. All glyphs that pass through the auto-hinter will be emboldened unless this property is set to TRUE.</p>
-<p>See the description of the CFF driver for algorithmic details. Total consistency with the CFF driver is currently not achieved because the emboldening method differs and glyphs must be scaled down on the Y-axis to keep outline points inside their precomputed blue zones. The smaller the size (especially 9ppem and down), the higher the loss of emboldening versus the CFF driver.</p>
-<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable similar to the CFF driver. It can also be set per face using <a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a> with <a href="ft2-auto_hinter.html#FT_PARAM_TAG_STEM_DARKENING">FT_PARAM_TAG_STEM_DARKENING</a>.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="FT_PARAM_TAG_STEM_DARKENING">FT_PARAM_TAG_STEM_DARKENING</h3>
-<p>Defined in FT_AUTOHINTER_H (freetype/ftautoh.h).</p>
-<pre>
-#define <b>FT_PARAM_TAG_STEM_DARKENING</b> \
-          <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 'd', 'a', 'r', 'k' )
-</pre>
-
-<p>An <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> tag to be used with <a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a>. The corresponding Boolean argument specifies whether to apply stem darkening, overriding the global default values or the values set up with <a href="ft2-module_management.html#FT_Property_Set">FT_Property_Set</a> (see <a href="ft2-auto_hinter.html#no-stem-darkening(autofit)">no-stem-darkening</a> and <a href="ft2-cff_driver.html#no-stem-darkening(cff)">no-stem-darkening</a>).</p>
-<p>This is a passive setting that only takes effect if the font driver or autohinter honors it, which the CFF driver always does, but the autohinter only in &lsquo;light&rsquo; hinting mode (as of version 2.7.0).</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="darkening-parameters(autofit)">darkening-parameters</h3>
-
-<p><b>Experimental</b> <b>only</b></p>
-<p>See the description of the CFF driver for details. This implementation appropriates the CFF_CONFIG_OPTION_DARKENING_PARAMETER_* #defines for consistency. Note the differences described in <a href="ft2-auto_hinter.html#no-stem-darkening(autofit)">no-stem-darkening</a>.</p>
-<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable similar to the CFF driver.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+<p>Available properties are <a href="ft2-properties.html#increase-x-height">increase-x-height</a>, <a href="ft2-properties.html#no-stem-darkening">no-stem-darkening</a> (experimental), <a href="ft2-properties.html#darkening-parameters">darkening-parameters</a> (experimental), <a href="ft2-properties.html#warping">warping</a> (experimental), <a href="ft2-properties.html#glyph-to-script-map">glyph-to-script-map</a> (experimental), <a href="ft2-properties.html#fallback-script">fallback-script</a> (experimental), and <a href="ft2-properties.html#default-script">default-script</a> (experimental), as documented in the &lsquo;<a href="ft2-properties.html#properties">Driver properties</a>&rsquo; section.</p>
 
 </body>
 </html>
index 8d0e135..936a9c4 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="base_interface">Base Interface</h1>
 <h2>Synopsis</h2>
 <table class="synopsis">
-<tr><td><a href="#FT_Library">FT_Library</a></td><td><a href="#FT_SubGlyph">FT_SubGlyph</a></td><td><a href="#FT_LOAD_COLOR">FT_LOAD_COLOR</a></td></tr>
-<tr><td><a href="#FT_Face">FT_Face</a></td><td>&nbsp;</td><td>&nbsp;</td></tr>
-<tr><td><a href="#FT_Size">FT_Size</a></td><td><a href="#FT_Bitmap_Size">FT_Bitmap_Size</a></td><td><a href="#FT_LOAD_VERTICAL_LAYOUT">FT_LOAD_VERTICAL_LAYOUT</a></td></tr>
-<tr><td><a href="#FT_GlyphSlot">FT_GlyphSlot</a></td><td>&nbsp;</td><td><a href="#FT_LOAD_IGNORE_TRANSFORM">FT_LOAD_IGNORE_TRANSFORM</a></td></tr>
-<tr><td><a href="#FT_CharMap">FT_CharMap</a></td><td><a href="#FT_Init_FreeType">FT_Init_FreeType</a></td><td><a href="#FT_LOAD_FORCE_AUTOHINT">FT_LOAD_FORCE_AUTOHINT</a></td></tr>
-<tr><td><a href="#FT_Encoding">FT_Encoding</a></td><td><a href="#FT_Done_FreeType">FT_Done_FreeType</a></td><td><a href="#FT_LOAD_NO_RECURSE">FT_LOAD_NO_RECURSE</a></td></tr>
-<tr><td><a href="#FT_ENC_TAG">FT_ENC_TAG</a></td><td>&nbsp;</td><td><a href="#FT_LOAD_PEDANTIC">FT_LOAD_PEDANTIC</a></td></tr>
-<tr><td>&nbsp;</td><td><a href="#FT_New_Face">FT_New_Face</a></td><td>&nbsp;</td></tr>
-<tr><td><a href="#FT_FaceRec">FT_FaceRec</a></td><td><a href="#FT_Done_Face">FT_Done_Face</a></td><td><a href="#FT_LOAD_TARGET_NORMAL">FT_LOAD_TARGET_NORMAL</a></td></tr>
-<tr><td>&nbsp;</td><td><a href="#FT_Reference_Face">FT_Reference_Face</a></td><td><a href="#FT_LOAD_TARGET_LIGHT">FT_LOAD_TARGET_LIGHT</a></td></tr>
-<tr><td><a href="#FT_FACE_FLAG_SCALABLE">FT_FACE_FLAG_SCALABLE</a></td><td><a href="#FT_New_Memory_Face">FT_New_Memory_Face</a></td><td><a href="#FT_LOAD_TARGET_MONO">FT_LOAD_TARGET_MONO</a></td></tr>
-<tr><td><a href="#FT_FACE_FLAG_FIXED_SIZES">FT_FACE_FLAG_FIXED_SIZES</a></td><td><a href="#FT_Face_Properties">FT_Face_Properties</a></td><td><a href="#FT_LOAD_TARGET_LCD">FT_LOAD_TARGET_LCD</a></td></tr>
-<tr><td><a href="#FT_FACE_FLAG_FIXED_WIDTH">FT_FACE_FLAG_FIXED_WIDTH</a></td><td><a href="#FT_Open_Face">FT_Open_Face</a></td><td><a href="#FT_LOAD_TARGET_LCD_V">FT_LOAD_TARGET_LCD_V</a></td></tr>
-<tr><td><a href="#FT_FACE_FLAG_HORIZONTAL">FT_FACE_FLAG_HORIZONTAL</a></td><td><a href="#FT_Open_Args">FT_Open_Args</a></td><td>&nbsp;</td></tr>
-<tr><td><a href="#FT_FACE_FLAG_VERTICAL">FT_FACE_FLAG_VERTICAL</a></td><td><a href="#FT_Parameter">FT_Parameter</a></td><td><a href="#FT_LOAD_TARGET_MODE">FT_LOAD_TARGET_MODE</a></td></tr>
-<tr><td><a href="#FT_FACE_FLAG_COLOR">FT_FACE_FLAG_COLOR</a></td><td><a href="#FT_Attach_File">FT_Attach_File</a></td><td>&nbsp;</td></tr>
-<tr><td><a href="#FT_FACE_FLAG_SFNT">FT_FACE_FLAG_SFNT</a></td><td><a href="#FT_Attach_Stream">FT_Attach_Stream</a></td><td><a href="#FT_Render_Glyph">FT_Render_Glyph</a></td></tr>
-<tr><td><a href="#FT_FACE_FLAG_CID_KEYED">FT_FACE_FLAG_CID_KEYED</a></td><td>&nbsp;</td><td><a href="#FT_Render_Mode">FT_Render_Mode</a></td></tr>
-<tr><td><a href="#FT_FACE_FLAG_TRICKY">FT_FACE_FLAG_TRICKY</a></td><td><a href="#FT_Set_Char_Size">FT_Set_Char_Size</a></td><td><a href="#FT_Get_Kerning">FT_Get_Kerning</a></td></tr>
-<tr><td><a href="#FT_FACE_FLAG_KERNING">FT_FACE_FLAG_KERNING</a></td><td><a href="#FT_Set_Pixel_Sizes">FT_Set_Pixel_Sizes</a></td><td><a href="#FT_Kerning_Mode">FT_Kerning_Mode</a></td></tr>
-<tr><td><a href="#FT_FACE_FLAG_MULTIPLE_MASTERS">FT_FACE_FLAG_MULTIPLE_MASTERS</a></td><td><a href="#FT_Request_Size">FT_Request_Size</a></td><td><a href="#FT_Get_Track_Kerning">FT_Get_Track_Kerning</a></td></tr>
-<tr><td><a href="#FT_FACE_FLAG_GLYPH_NAMES">FT_FACE_FLAG_GLYPH_NAMES</a></td><td><a href="#FT_Select_Size">FT_Select_Size</a></td><td><a href="#FT_Get_Glyph_Name">FT_Get_Glyph_Name</a></td></tr>
-<tr><td><a href="#FT_FACE_FLAG_EXTERNAL_STREAM">FT_FACE_FLAG_EXTERNAL_STREAM</a></td><td><a href="#FT_Size_Request_Type">FT_Size_Request_Type</a></td><td><a href="#FT_Get_Postscript_Name">FT_Get_Postscript_Name</a></td></tr>
-<tr><td><a href="#FT_FACE_FLAG_HINTER">FT_FACE_FLAG_HINTER</a></td><td><a href="#FT_Size_RequestRec">FT_Size_RequestRec</a></td><td>&nbsp;</td></tr>
-<tr><td>&nbsp;</td><td><a href="#FT_Size_Request">FT_Size_Request</a></td><td><a href="#FT_CharMapRec">FT_CharMapRec</a></td></tr>
-<tr><td><a href="#FT_HAS_HORIZONTAL">FT_HAS_HORIZONTAL</a></td><td><a href="#FT_Set_Transform">FT_Set_Transform</a></td><td><a href="#FT_Select_Charmap">FT_Select_Charmap</a></td></tr>
-<tr><td><a href="#FT_HAS_VERTICAL">FT_HAS_VERTICAL</a></td><td><a href="#FT_Load_Glyph">FT_Load_Glyph</a></td><td><a href="#FT_Set_Charmap">FT_Set_Charmap</a></td></tr>
-<tr><td><a href="#FT_HAS_KERNING">FT_HAS_KERNING</a></td><td><a href="#FT_Get_Char_Index">FT_Get_Char_Index</a></td><td><a href="#FT_Get_Charmap_Index">FT_Get_Charmap_Index</a></td></tr>
-<tr><td><a href="#FT_HAS_FIXED_SIZES">FT_HAS_FIXED_SIZES</a></td><td><a href="#FT_Get_First_Char">FT_Get_First_Char</a></td><td>&nbsp;</td></tr>
-<tr><td><a href="#FT_HAS_GLYPH_NAMES">FT_HAS_GLYPH_NAMES</a></td><td><a href="#FT_Get_Next_Char">FT_Get_Next_Char</a></td><td><a href="#FT_Get_FSType_Flags">FT_Get_FSType_Flags</a></td></tr>
-<tr><td><a href="#FT_HAS_MULTIPLE_MASTERS">FT_HAS_MULTIPLE_MASTERS</a></td><td><a href="#FT_Get_Name_Index">FT_Get_Name_Index</a></td><td><a href="#FT_Get_SubGlyph_Info">FT_Get_SubGlyph_Info</a></td></tr>
-<tr><td><a href="#FT_HAS_COLOR">FT_HAS_COLOR</a></td><td><a href="#FT_Load_Char">FT_Load_Char</a></td><td>&nbsp;</td></tr>
-<tr><td>&nbsp;</td><td>&nbsp;</td><td><a href="#FT_Face_Internal">FT_Face_Internal</a></td></tr>
-<tr><td><a href="#FT_IS_SFNT">FT_IS_SFNT</a></td><td><a href="#FT_OPEN_MEMORY">FT_OPEN_MEMORY</a></td><td><a href="#FT_Size_Internal">FT_Size_Internal</a></td></tr>
-<tr><td><a href="#FT_IS_SCALABLE">FT_IS_SCALABLE</a></td><td><a href="#FT_OPEN_STREAM">FT_OPEN_STREAM</a></td><td><a href="#FT_Slot_Internal">FT_Slot_Internal</a></td></tr>
-<tr><td><a href="#FT_IS_FIXED_WIDTH">FT_IS_FIXED_WIDTH</a></td><td><a href="#FT_OPEN_PATHNAME">FT_OPEN_PATHNAME</a></td><td>&nbsp;</td></tr>
-<tr><td><a href="#FT_IS_CID_KEYED">FT_IS_CID_KEYED</a></td><td><a href="#FT_OPEN_DRIVER">FT_OPEN_DRIVER</a></td><td><a href="#FT_FACE_FLAG_XXX">FT_FACE_FLAG_XXX</a></td></tr>
-<tr><td><a href="#FT_IS_TRICKY">FT_IS_TRICKY</a></td><td><a href="#FT_OPEN_PARAMS">FT_OPEN_PARAMS</a></td><td><a href="#FT_STYLE_FLAG_XXX">FT_STYLE_FLAG_XXX</a></td></tr>
-<tr><td>&nbsp;</td><td>&nbsp;</td><td><a href="#FT_OPEN_XXX">FT_OPEN_XXX</a></td></tr>
-<tr><td><a href="#FT_STYLE_FLAG_BOLD">FT_STYLE_FLAG_BOLD</a></td><td><a href="#FT_LOAD_DEFAULT">FT_LOAD_DEFAULT</a></td><td><a href="#FT_LOAD_XXX">FT_LOAD_XXX</a></td></tr>
-<tr><td><a href="#FT_STYLE_FLAG_ITALIC">FT_STYLE_FLAG_ITALIC</a></td><td><a href="#FT_LOAD_RENDER">FT_LOAD_RENDER</a></td><td><a href="#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_XXX</a></td></tr>
-<tr><td>&nbsp;</td><td><a href="#FT_LOAD_MONOCHROME">FT_LOAD_MONOCHROME</a></td><td><a href="#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_XXX</a></td></tr>
-<tr><td><a href="#FT_SizeRec">FT_SizeRec</a></td><td><a href="#FT_LOAD_LINEAR_DESIGN">FT_LOAD_LINEAR_DESIGN</a></td><td><a href="#FT_FSTYPE_XXX">FT_FSTYPE_XXX</a></td></tr>
-<tr><td><a href="#FT_Size_Metrics">FT_Size_Metrics</a></td><td><a href="#FT_LOAD_NO_SCALE">FT_LOAD_NO_SCALE</a></td><td>&nbsp;</td></tr>
-<tr><td>&nbsp;</td><td><a href="#FT_LOAD_NO_HINTING">FT_LOAD_NO_HINTING</a></td><td><a href="#FT_HAS_FAST_GLYPHS">FT_HAS_FAST_GLYPHS</a></td></tr>
-<tr><td><a href="#FT_GlyphSlotRec">FT_GlyphSlotRec</a></td><td><a href="#FT_LOAD_NO_BITMAP">FT_LOAD_NO_BITMAP</a></td><td>&nbsp;</td></tr>
-<tr><td><a href="#FT_Glyph_Metrics">FT_Glyph_Metrics</a></td><td><a href="#FT_LOAD_NO_AUTOHINT">FT_LOAD_NO_AUTOHINT</a></td><td><a href="#FT_IS_NAMED_INSTANCE">FT_IS_NAMED_INSTANCE</a></td></tr>
+<tr><td><a href="#FT_Library">FT_Library</a></td><td><a href="#FT_GlyphSlotRec">FT_GlyphSlotRec</a></td><td><a href="#FT_LOAD_NO_AUTOHINT">FT_LOAD_NO_AUTOHINT</a></td></tr>
+<tr><td><a href="#FT_Face">FT_Face</a></td><td><a href="#FT_Glyph_Metrics">FT_Glyph_Metrics</a></td><td><a href="#FT_LOAD_COLOR">FT_LOAD_COLOR</a></td></tr>
+<tr><td><a href="#FT_Size">FT_Size</a></td><td><a href="#FT_SubGlyph">FT_SubGlyph</a></td><td>&nbsp;</td></tr>
+<tr><td><a href="#FT_GlyphSlot">FT_GlyphSlot</a></td><td>&nbsp;</td><td><a href="#FT_LOAD_VERTICAL_LAYOUT">FT_LOAD_VERTICAL_LAYOUT</a></td></tr>
+<tr><td><a href="#FT_CharMap">FT_CharMap</a></td><td><a href="#FT_Bitmap_Size">FT_Bitmap_Size</a></td><td><a href="#FT_LOAD_IGNORE_TRANSFORM">FT_LOAD_IGNORE_TRANSFORM</a></td></tr>
+<tr><td><a href="#FT_Encoding">FT_Encoding</a></td><td>&nbsp;</td><td><a href="#FT_LOAD_FORCE_AUTOHINT">FT_LOAD_FORCE_AUTOHINT</a></td></tr>
+<tr><td><a href="#FT_ENC_TAG">FT_ENC_TAG</a></td><td><a href="#FT_Init_FreeType">FT_Init_FreeType</a></td><td><a href="#FT_LOAD_NO_RECURSE">FT_LOAD_NO_RECURSE</a></td></tr>
+<tr><td>&nbsp;</td><td><a href="#FT_Done_FreeType">FT_Done_FreeType</a></td><td><a href="#FT_LOAD_PEDANTIC">FT_LOAD_PEDANTIC</a></td></tr>
+<tr><td><a href="#FT_FaceRec">FT_FaceRec</a></td><td>&nbsp;</td><td>&nbsp;</td></tr>
+<tr><td>&nbsp;</td><td><a href="#FT_New_Face">FT_New_Face</a></td><td><a href="#FT_LOAD_TARGET_NORMAL">FT_LOAD_TARGET_NORMAL</a></td></tr>
+<tr><td><a href="#FT_FACE_FLAG_SCALABLE">FT_FACE_FLAG_SCALABLE</a></td><td><a href="#FT_Done_Face">FT_Done_Face</a></td><td><a href="#FT_LOAD_TARGET_LIGHT">FT_LOAD_TARGET_LIGHT</a></td></tr>
+<tr><td><a href="#FT_FACE_FLAG_FIXED_SIZES">FT_FACE_FLAG_FIXED_SIZES</a></td><td><a href="#FT_Reference_Face">FT_Reference_Face</a></td><td><a href="#FT_LOAD_TARGET_MONO">FT_LOAD_TARGET_MONO</a></td></tr>
+<tr><td><a href="#FT_FACE_FLAG_FIXED_WIDTH">FT_FACE_FLAG_FIXED_WIDTH</a></td><td><a href="#FT_New_Memory_Face">FT_New_Memory_Face</a></td><td><a href="#FT_LOAD_TARGET_LCD">FT_LOAD_TARGET_LCD</a></td></tr>
+<tr><td><a href="#FT_FACE_FLAG_HORIZONTAL">FT_FACE_FLAG_HORIZONTAL</a></td><td><a href="#FT_Face_Properties">FT_Face_Properties</a></td><td><a href="#FT_LOAD_TARGET_LCD_V">FT_LOAD_TARGET_LCD_V</a></td></tr>
+<tr><td><a href="#FT_FACE_FLAG_VERTICAL">FT_FACE_FLAG_VERTICAL</a></td><td><a href="#FT_Open_Face">FT_Open_Face</a></td><td>&nbsp;</td></tr>
+<tr><td><a href="#FT_FACE_FLAG_COLOR">FT_FACE_FLAG_COLOR</a></td><td><a href="#FT_Open_Args">FT_Open_Args</a></td><td><a href="#FT_LOAD_TARGET_MODE">FT_LOAD_TARGET_MODE</a></td></tr>
+<tr><td><a href="#FT_FACE_FLAG_SFNT">FT_FACE_FLAG_SFNT</a></td><td><a href="#FT_Parameter">FT_Parameter</a></td><td>&nbsp;</td></tr>
+<tr><td><a href="#FT_FACE_FLAG_CID_KEYED">FT_FACE_FLAG_CID_KEYED</a></td><td><a href="#FT_Attach_File">FT_Attach_File</a></td><td><a href="#FT_Render_Glyph">FT_Render_Glyph</a></td></tr>
+<tr><td><a href="#FT_FACE_FLAG_TRICKY">FT_FACE_FLAG_TRICKY</a></td><td><a href="#FT_Attach_Stream">FT_Attach_Stream</a></td><td><a href="#FT_Render_Mode">FT_Render_Mode</a></td></tr>
+<tr><td><a href="#FT_FACE_FLAG_KERNING">FT_FACE_FLAG_KERNING</a></td><td>&nbsp;</td><td><a href="#FT_Get_Kerning">FT_Get_Kerning</a></td></tr>
+<tr><td><a href="#FT_FACE_FLAG_MULTIPLE_MASTERS">FT_FACE_FLAG_MULTIPLE_MASTERS</a></td><td><a href="#FT_Set_Char_Size">FT_Set_Char_Size</a></td><td><a href="#FT_Kerning_Mode">FT_Kerning_Mode</a></td></tr>
+<tr><td><a href="#FT_FACE_FLAG_VARIATION">FT_FACE_FLAG_VARIATION</a></td><td><a href="#FT_Set_Pixel_Sizes">FT_Set_Pixel_Sizes</a></td><td><a href="#FT_Get_Track_Kerning">FT_Get_Track_Kerning</a></td></tr>
+<tr><td><a href="#FT_FACE_FLAG_GLYPH_NAMES">FT_FACE_FLAG_GLYPH_NAMES</a></td><td><a href="#FT_Request_Size">FT_Request_Size</a></td><td><a href="#FT_Get_Glyph_Name">FT_Get_Glyph_Name</a></td></tr>
+<tr><td><a href="#FT_FACE_FLAG_EXTERNAL_STREAM">FT_FACE_FLAG_EXTERNAL_STREAM</a></td><td><a href="#FT_Select_Size">FT_Select_Size</a></td><td><a href="#FT_Get_Postscript_Name">FT_Get_Postscript_Name</a></td></tr>
+<tr><td><a href="#FT_FACE_FLAG_HINTER">FT_FACE_FLAG_HINTER</a></td><td><a href="#FT_Size_Request_Type">FT_Size_Request_Type</a></td><td>&nbsp;</td></tr>
+<tr><td>&nbsp;</td><td><a href="#FT_Size_RequestRec">FT_Size_RequestRec</a></td><td><a href="#FT_CharMapRec">FT_CharMapRec</a></td></tr>
+<tr><td><a href="#FT_HAS_HORIZONTAL">FT_HAS_HORIZONTAL</a></td><td><a href="#FT_Size_Request">FT_Size_Request</a></td><td><a href="#FT_Select_Charmap">FT_Select_Charmap</a></td></tr>
+<tr><td><a href="#FT_HAS_VERTICAL">FT_HAS_VERTICAL</a></td><td><a href="#FT_Set_Transform">FT_Set_Transform</a></td><td><a href="#FT_Set_Charmap">FT_Set_Charmap</a></td></tr>
+<tr><td><a href="#FT_HAS_KERNING">FT_HAS_KERNING</a></td><td><a href="#FT_Load_Glyph">FT_Load_Glyph</a></td><td><a href="#FT_Get_Charmap_Index">FT_Get_Charmap_Index</a></td></tr>
+<tr><td><a href="#FT_HAS_FIXED_SIZES">FT_HAS_FIXED_SIZES</a></td><td><a href="#FT_Get_Char_Index">FT_Get_Char_Index</a></td><td>&nbsp;</td></tr>
+<tr><td><a href="#FT_HAS_GLYPH_NAMES">FT_HAS_GLYPH_NAMES</a></td><td><a href="#FT_Get_First_Char">FT_Get_First_Char</a></td><td><a href="#FT_Get_FSType_Flags">FT_Get_FSType_Flags</a></td></tr>
+<tr><td><a href="#FT_HAS_COLOR">FT_HAS_COLOR</a></td><td><a href="#FT_Get_Next_Char">FT_Get_Next_Char</a></td><td><a href="#FT_Get_SubGlyph_Info">FT_Get_SubGlyph_Info</a></td></tr>
+<tr><td><a href="#FT_HAS_MULTIPLE_MASTERS">FT_HAS_MULTIPLE_MASTERS</a></td><td><a href="#FT_Get_Name_Index">FT_Get_Name_Index</a></td><td>&nbsp;</td></tr>
+<tr><td>&nbsp;</td><td><a href="#FT_Load_Char">FT_Load_Char</a></td><td><a href="#FT_Face_Internal">FT_Face_Internal</a></td></tr>
+<tr><td><a href="#FT_IS_SFNT">FT_IS_SFNT</a></td><td>&nbsp;</td><td><a href="#FT_Size_Internal">FT_Size_Internal</a></td></tr>
+<tr><td><a href="#FT_IS_SCALABLE">FT_IS_SCALABLE</a></td><td><a href="#FT_OPEN_MEMORY">FT_OPEN_MEMORY</a></td><td><a href="#FT_Slot_Internal">FT_Slot_Internal</a></td></tr>
+<tr><td><a href="#FT_IS_FIXED_WIDTH">FT_IS_FIXED_WIDTH</a></td><td><a href="#FT_OPEN_STREAM">FT_OPEN_STREAM</a></td><td>&nbsp;</td></tr>
+<tr><td><a href="#FT_IS_CID_KEYED">FT_IS_CID_KEYED</a></td><td><a href="#FT_OPEN_PATHNAME">FT_OPEN_PATHNAME</a></td><td><a href="#FT_FACE_FLAG_XXX">FT_FACE_FLAG_XXX</a></td></tr>
+<tr><td><a href="#FT_IS_TRICKY">FT_IS_TRICKY</a></td><td><a href="#FT_OPEN_DRIVER">FT_OPEN_DRIVER</a></td><td><a href="#FT_STYLE_FLAG_XXX">FT_STYLE_FLAG_XXX</a></td></tr>
+<tr><td><a href="#FT_IS_NAMED_INSTANCE">FT_IS_NAMED_INSTANCE</a></td><td><a href="#FT_OPEN_PARAMS">FT_OPEN_PARAMS</a></td><td><a href="#FT_OPEN_XXX">FT_OPEN_XXX</a></td></tr>
+<tr><td><a href="#FT_IS_VARIATION">FT_IS_VARIATION</a></td><td>&nbsp;</td><td><a href="#FT_LOAD_XXX">FT_LOAD_XXX</a></td></tr>
+<tr><td>&nbsp;</td><td><a href="#FT_LOAD_DEFAULT">FT_LOAD_DEFAULT</a></td><td><a href="#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_XXX</a></td></tr>
+<tr><td><a href="#FT_STYLE_FLAG_BOLD">FT_STYLE_FLAG_BOLD</a></td><td><a href="#FT_LOAD_RENDER">FT_LOAD_RENDER</a></td><td><a href="#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_XXX</a></td></tr>
+<tr><td><a href="#FT_STYLE_FLAG_ITALIC">FT_STYLE_FLAG_ITALIC</a></td><td><a href="#FT_LOAD_MONOCHROME">FT_LOAD_MONOCHROME</a></td><td><a href="#FT_FSTYPE_XXX">FT_FSTYPE_XXX</a></td></tr>
+<tr><td>&nbsp;</td><td><a href="#FT_LOAD_LINEAR_DESIGN">FT_LOAD_LINEAR_DESIGN</a></td><td>&nbsp;</td></tr>
+<tr><td><a href="#FT_SizeRec">FT_SizeRec</a></td><td><a href="#FT_LOAD_NO_SCALE">FT_LOAD_NO_SCALE</a></td><td><a href="#FT_HAS_FAST_GLYPHS">FT_HAS_FAST_GLYPHS</a></td></tr>
+<tr><td><a href="#FT_Size_Metrics">FT_Size_Metrics</a></td><td><a href="#FT_LOAD_NO_HINTING">FT_LOAD_NO_HINTING</a></td><td></td></tr>
+<tr><td>&nbsp;</td><td><a href="#FT_LOAD_NO_BITMAP">FT_LOAD_NO_BITMAP</a></td><td></td></tr>
 </table>
 
 
 <p>The currently active charmap is available as &lsquo;face-&gt;charmap&rsquo;. You should call <a href="ft2-base_interface.html#FT_Set_Charmap">FT_Set_Charmap</a> to change it.</p>
 
 <h4>note</h4>
-<p>When a new face is created (either through <a href="ft2-base_interface.html#FT_New_Face">FT_New_Face</a> or <a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a>), the library looks for a Unicode charmap within the list and automatically activates it.</p>
+<p>When a new face is created (either through <a href="ft2-base_interface.html#FT_New_Face">FT_New_Face</a> or <a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a>), the library looks for a Unicode charmap within the list and automatically activates it. If there is no Unicode charmap, FreeType doesn't set an &lsquo;active&rsquo; charmap.</p>
 
 <h4>also</h4>
 <p>See <a href="ft2-base_interface.html#FT_CharMapRec">FT_CharMapRec</a> for the publicly accessible fields of a given character map.</p>
 <p>For example, if you want to access Unicode value U+1F028 (and the font contains it), use value 0x1F028 as the input value for <a href="ft2-base_interface.html#FT_Get_Char_Index">FT_Get_Char_Index</a>.</p>
 </td></tr>
 <tr><td class="val" id="FT_ENCODING_MS_SYMBOL">FT_ENCODING_MS_SYMBOL</td><td class="desc">
-<p>Microsoft Symbol encoding, used to encode mathematical symbols and wingdings. For more information, see &lsquo;<a href="http://www.microsoft.com/typography/otspec/recom.htm">http://www.microsoft.com/typography/otspec/recom.htm</a>&rsquo;, &lsquo;<a href="http://www.kostis.net/charsets/symbol.htm">http://www.kostis.net/charsets/symbol.htm</a>&rsquo;, and &lsquo;<a href="http://www.kostis.net/charsets/wingding.htm">http://www.kostis.net/charsets/wingding.htm</a>&rsquo;.</p>
+<p>Microsoft Symbol encoding, used to encode mathematical symbols and wingdings. For more information, see &lsquo;<a href="https://www.microsoft.com/typography/otspec/recom.htm">https://www.microsoft.com/typography/otspec/recom.htm</a>&rsquo;, &lsquo;<a href="http://www.kostis.net/charsets/symbol.htm">http://www.kostis.net/charsets/symbol.htm</a>&rsquo;, and &lsquo;<a href="http://www.kostis.net/charsets/wingding.htm">http://www.kostis.net/charsets/wingding.htm</a>&rsquo;.</p>
 <p>This encoding uses character codes from the PUA (Private Unicode Area) in the range U+F020-U+F0FF.</p>
 </td></tr>
 <tr><td class="val" id="FT_ENCODING_SJIS">FT_ENCODING_SJIS</td><td class="desc">
-<p>Shift JIS encoding for Japanese. More info at &lsquo;<a href="http://en.wikipedia.org/wiki/Shift_JIS">http://en.wikipedia.org/wiki/Shift_JIS</a>&rsquo;. See note on multi-byte encodings below.</p>
+<p>Shift JIS encoding for Japanese. More info at &lsquo;<a href="https://en.wikipedia.org/wiki/Shift_JIS">https://en.wikipedia.org/wiki/Shift_JIS</a>&rsquo;. See note on multi-byte encodings below.</p>
 </td></tr>
 <tr><td class="val" id="FT_ENCODING_PRC">FT_ENCODING_PRC</td><td class="desc">
 <p>Corresponds to encoding systems mainly for Simplified Chinese as used in People's Republic of China (PRC). The encoding layout is based on GB&nbsp;2312 and its supersets GBK and GB&nbsp;18030.</p>
 <p>Corresponds to an encoding system for Traditional Chinese as used in Taiwan and Hong Kong.</p>
 </td></tr>
 <tr><td class="val" id="FT_ENCODING_WANSUNG">FT_ENCODING_WANSUNG</td><td class="desc">
-<p>Corresponds to the Korean encoding system known as Extended Wansung (MS Windows code page 949). For more information see &lsquo;<a href="http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit949.txt">http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit949.txt</a>&rsquo;.</p>
+<p>Corresponds to the Korean encoding system known as Extended Wansung (MS Windows code page 949). For more information see &lsquo;<a href="https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit949.txt">https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit949.txt</a>&rsquo;.</p>
 </td></tr>
 <tr><td class="val" id="FT_ENCODING_JOHAB">FT_ENCODING_JOHAB</td><td class="desc">
 <p>The Korean standard character set (KS&nbsp;C 5601-1992), which corresponds to MS Windows code page 1361. This character set includes all possible Hangul character combinations.</p>
 <p>FT_ENCODING_NONE is always set (with a single exception) by the winfonts driver. Use <a href="ft2-winfnt_fonts.html#FT_Get_WinFNT_Header">FT_Get_WinFNT_Header</a> and examine the &lsquo;charset&rsquo; field of the <a href="ft2-winfnt_fonts.html#FT_WinFNT_HeaderRec">FT_WinFNT_HeaderRec</a> structure to find out which encoding is really present. For example, <a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1251</a> (204) means Windows code page 1251 (for Russian).</p>
 <p>FT_ENCODING_NONE is set if &lsquo;platform_id&rsquo; is <a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_MACINTOSH</a> and &lsquo;encoding_id&rsquo; is not &lsquo;TT_MAC_ID_ROMAN&rsquo; (otherwise it is set to FT_ENCODING_APPLE_ROMAN).</p>
 <p>If &lsquo;platform_id&rsquo; is <a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_MACINTOSH</a>, use the function <a href="ft2-truetype_tables.html#FT_Get_CMap_Language_ID">FT_Get_CMap_Language_ID</a> to query the Mac language ID that may be needed to be able to distinguish Apple encoding variants. See</p>
-<p><a href="http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt">http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt</a></p>
+<p><a href="https://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt">https://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt</a></p>
 <p>to get an idea how to do that. Basically, if the language ID is&nbsp;0, don't use it, otherwise subtract 1 from the language ID. Then examine &lsquo;encoding_id&rsquo;. If, for example, &lsquo;encoding_id&rsquo; is &lsquo;TT_MAC_ID_ROMAN&rsquo; and the language ID (minus&nbsp;1) is &lsquo;TT_MAC_LANGID_GREEK&rsquo;, it is the Greek encoding, not Roman. &lsquo;TT_MAC_ID_ARABIC&rsquo; with &lsquo;TT_MAC_LANGID_FARSI&rsquo; means the Farsi variant the Arabic encoding.</p>
 
 <hr>
 </td></tr>
 <tr><td class="val" id="face_index">face_index</td><td class="desc">
 <p>This field holds two different values. Bits 0-15 are the index of the face in the font file (starting with value&nbsp;0). They are set to&nbsp;0 if there is only one face in the font file.</p>
-<p>Bits 16-30 are relevant to GX and OpenType variation fonts only, holding the named instance index for the current face index (starting with value&nbsp;1; value&nbsp;0 indicates font access without a named instance). For non-variation fonts, bits 16-30 are ignored. If we have the third named instance of face&nbsp;4, say, &lsquo;face_index&rsquo; is set to 0x00030004.</p>
+<p>[Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation fonts only, holding the named instance index for the current face index (starting with value&nbsp;1; value&nbsp;0 indicates font access without a named instance). For non-variation fonts, bits 16-30 are ignored. If we have the third named instance of face&nbsp;4, say, &lsquo;face_index&rsquo; is set to 0x00030004.</p>
 <p>Bit 31 is always zero (this is, &lsquo;face_index&rsquo; is always a positive value).</p>
+<p>[Since 2.9] Changing the design coordinates with <a href="ft2-multiple_masters.html#FT_Set_Var_Design_Coordinates">FT_Set_Var_Design_Coordinates</a> or <a href="ft2-multiple_masters.html#FT_Set_Var_Blend_Coordinates">FT_Set_Var_Blend_Coordinates</a> does not influence the named instance index value (only <a href="ft2-multiple_masters.html#FT_Set_Named_Instance">FT_Set_Named_Instance</a> does that).</p>
 </td></tr>
 <tr><td class="val" id="face_flags">face_flags</td><td class="desc">
 <p>A set of bit flags that give important information about the face; see <a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_XXX</a> for the details.</p>
 </td></tr>
 <tr><td class="val" id="style_flags">style_flags</td><td class="desc">
-<p>The lower 16&nbsp;bits contain a set of bit flags indicating the style of the face; see <a href="ft2-base_interface.html#FT_STYLE_FLAG_XXX">FT_STYLE_FLAG_XXX</a> for the details. Bits 16-30 hold the number of named instances available for the current face if we have a GX or OpenType variation (sub)font. Bit 31 is always zero (this is, &lsquo;style_flags&rsquo; is always a positive value). Note that a variation font has always at least one named instance, namely the default instance.</p>
+<p>The lower 16&nbsp;bits contain a set of bit flags indicating the style of the face; see <a href="ft2-base_interface.html#FT_STYLE_FLAG_XXX">FT_STYLE_FLAG_XXX</a> for the details.</p>
+<p>[Since 2.6.1] Bits 16-30 hold the number of named instances available for the current face if we have a GX or OpenType variation (sub)font. Bit 31 is always zero (this is, &lsquo;style_flags&rsquo; is always a positive value). Note that a variation font has always at least one named instance, namely the default instance.</p>
 </td></tr>
 <tr><td class="val" id="num_glyphs">num_glyphs</td><td class="desc">
 <p>The number of glyphs in the face. If the face is scalable and has sbits (see &lsquo;num_fixed_sizes&rsquo;), it is set to the number of outline glyphs.</p>
 <h4>note</h4>
 <p>Fields may be changed after a call to <a href="ft2-base_interface.html#FT_Attach_File">FT_Attach_File</a> or <a href="ft2-base_interface.html#FT_Attach_Stream">FT_Attach_Stream</a>.</p>
 <p>For an OpenType variation font, the values of the following fields can change after a call to <a href="ft2-multiple_masters.html#FT_Set_Var_Design_Coordinates">FT_Set_Var_Design_Coordinates</a> (and friends) if the font contains an &lsquo;MVAR&rsquo; table: &lsquo;ascender&rsquo;, &lsquo;descender&rsquo;, &lsquo;height&rsquo;, &lsquo;underline_position&rsquo;, and &lsquo;underline_thickness&rsquo;.</p>
+<p>Especially for TrueType fonts see also the documentation for <a href="ft2-base_interface.html#FT_Size_Metrics">FT_Size_Metrics</a>.</p>
 
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 <div class="section">
-<h3 id="FT_HAS_MULTIPLE_MASTERS">FT_HAS_MULTIPLE_MASTERS</h3>
+<h3 id="FT_HAS_COLOR">FT_HAS_COLOR</h3>
 <p>Defined in FT_FREETYPE_H (freetype/freetype.h).</p>
 <pre>
-#define <b>FT_HAS_MULTIPLE_MASTERS</b>( face ) \
-          ( (face)-&gt;face_flags &amp; <a href="ft2-base_interface.html#FT_FACE_FLAG_MULTIPLE_MASTERS">FT_FACE_FLAG_MULTIPLE_MASTERS</a> )
+#define <b>FT_HAS_COLOR</b>( face ) \
+          ( (face)-&gt;face_flags &amp; <a href="ft2-base_interface.html#FT_FACE_FLAG_COLOR">FT_FACE_FLAG_COLOR</a> )
 </pre>
 
-<p>A macro that returns true whenever a face object contains some multiple masters. The functions provided by <a href="ft2-header_file_macros.html#FT_MULTIPLE_MASTERS_H">FT_MULTIPLE_MASTERS_H</a> are then available to choose the exact design you want.</p>
+<p>A macro that returns true whenever a face object contains tables for color glyphs.</p>
+
+<h4>since</h4>
+<p>2.5.1</p>
 
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 <div class="section">
-<h3 id="FT_HAS_COLOR">FT_HAS_COLOR</h3>
+<h3 id="FT_HAS_MULTIPLE_MASTERS">FT_HAS_MULTIPLE_MASTERS</h3>
 <p>Defined in FT_FREETYPE_H (freetype/freetype.h).</p>
 <pre>
-#define <b>FT_HAS_COLOR</b>( face ) \
-          ( (face)-&gt;face_flags &amp; <a href="ft2-base_interface.html#FT_FACE_FLAG_COLOR">FT_FACE_FLAG_COLOR</a> )
+#define <b>FT_HAS_MULTIPLE_MASTERS</b>( face ) \
+          ( (face)-&gt;face_flags &amp; <a href="ft2-base_interface.html#FT_FACE_FLAG_MULTIPLE_MASTERS">FT_FACE_FLAG_MULTIPLE_MASTERS</a> )
 </pre>
 
-<p>A macro that returns true whenever a face object contains tables for color glyphs.</p>
+<p>A macro that returns true whenever a face object contains some multiple masters. The functions provided by <a href="ft2-header_file_macros.html#FT_MULTIPLE_MASTERS_H">FT_MULTIPLE_MASTERS_H</a> are then available to choose the exact design you want.</p>
 
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 <div class="section">
+<h3 id="FT_IS_NAMED_INSTANCE">FT_IS_NAMED_INSTANCE</h3>
+<p>Defined in FT_FREETYPE_H (freetype/freetype.h).</p>
+<pre>
+#define <b>FT_IS_NAMED_INSTANCE</b>( face ) \
+          ( (face)-&gt;face_index &amp; 0x7FFF0000L )
+</pre>
+
+<p>A macro that returns true whenever a face object is a named instance of a GX or OpenType variation font.</p>
+<p>[Since 2.9] Changing the design coordinates with <a href="ft2-multiple_masters.html#FT_Set_Var_Design_Coordinates">FT_Set_Var_Design_Coordinates</a> or <a href="ft2-multiple_masters.html#FT_Set_Var_Blend_Coordinates">FT_Set_Var_Blend_Coordinates</a> does not influence the return value of this macro (only <a href="ft2-multiple_masters.html#FT_Set_Named_Instance">FT_Set_Named_Instance</a> does that).</p>
+
+<h4>since</h4>
+<p>2.7</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="FT_IS_VARIATION">FT_IS_VARIATION</h3>
+<p>Defined in FT_FREETYPE_H (freetype/freetype.h).</p>
+<pre>
+#define <b>FT_IS_VARIATION</b>( face ) \
+          ( (face)-&gt;face_flags &amp; <a href="ft2-base_interface.html#FT_FACE_FLAG_VARIATION">FT_FACE_FLAG_VARIATION</a> )
+</pre>
+
+<p>A macro that returns true whenever a face object has been altered by <a href="ft2-multiple_masters.html#FT_Set_MM_Design_Coordinates">FT_Set_MM_Design_Coordinates</a>, <a href="ft2-multiple_masters.html#FT_Set_Var_Design_Coordinates">FT_Set_Var_Design_Coordinates</a>, or <a href="ft2-multiple_masters.html#FT_Set_Var_Blend_Coordinates">FT_Set_Var_Blend_Coordinates</a>.</p>
+
+<h4>since</h4>
+<p>2.9</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
 <h3 id="FT_SizeRec">FT_SizeRec</h3>
 <p>Defined in FT_FREETYPE_H (freetype/freetype.h).</p>
 <pre>
 </table>
 
 <h4>note</h4>
-<p>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 <a href="ft2-base_interface.html#FT_FaceRec">FT_FaceRec</a>. Some values like ascender or descender are rounded for historical reasons; more precise values (for outline fonts) can be derived by scaling the corresponding <a href="ft2-base_interface.html#FT_FaceRec">FT_FaceRec</a> values manually.</p>
+<p>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 <a href="ft2-base_interface.html#FT_FaceRec">FT_FaceRec</a>. Some values like ascender or descender are rounded for historical reasons; more precise values (for outline fonts) can be derived by scaling the corresponding <a href="ft2-base_interface.html#FT_FaceRec">FT_FaceRec</a> values manually, with code similar to the following.</p>
+<pre class="colored">
+  scaled_ascender = FT_MulFix( face-&gt;ascender,
+                               size_metrics-&gt;y_scale );
+</pre>
 <p>Note that due to glyph hinting and the selected rendering mode these values are usually not exact; consequently, they must be treated as unreliable with an error margin of at least one pixel!</p>
 <p>Indeed, the only way to get the exact metrics is to render <i>all</i> glyphs. As this would be a definite performance hit, it is up to client applications to perform such computations.</p>
 <p>The &lsquo;FT_Size_Metrics&rsquo; structure is valid for bitmap fonts also.</p>
+<p><b>TrueType</b> <b>fonts</b> <b>with</b> <b>native</b> <b>bytecode</b> <b>hinting</b></p>
+<p>All applications that handle TrueType fonts with native hinting must be aware that TTFs expect different rounding of vertical font dimensions. The application has to cater for this, especially if it wants to rely on a TTF's vertical data (for example, to properly align box characters vertically).</p>
+<p>Only the application knows <i>in</i> <i>advance</i> that it is going to use native hinting for TTFs! FreeType, on the other hand, selects the hinting mode not at the time of creating an <a href="ft2-base_interface.html#FT_Size">FT_Size</a> object but much later, namely while calling <a href="ft2-base_interface.html#FT_Load_Glyph">FT_Load_Glyph</a>.</p>
+<p>Here is some pseudo code that illustrates a possible solution.</p>
+<pre class="colored">
+  font_format = FT_Get_Font_Format( face );
+
+  if ( !strcmp( font_format, "TrueType" ) &amp;&amp;
+       do_native_bytecode_hinting         )
+  {
+    ascender  = ROUND( FT_MulFix( face-&gt;ascender,
+                                  size_metrics-&gt;y_scale ) );
+    descender = ROUND( FT_MulFix( face-&gt;descender,
+                                  size_metrics-&gt;y_scale ) );
+  }
+  else
+  {
+    ascender  = size_metrics-&gt;ascender;
+    descender = size_metrics-&gt;descender;
+  }
+
+  height      = size_metrics-&gt;height;
+  max_advance = size_metrics-&gt;max_advance;
+</pre>
 
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 <p>This field indicates the format of the image contained in the glyph slot. Typically <a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_BITMAP</a>, <a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_OUTLINE</a>, or <a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_COMPOSITE</a>, but other values are possible.</p>
 </td></tr>
 <tr><td class="val" id="bitmap">bitmap</td><td class="desc">
-<p>This field is used as a bitmap descriptor when the slot format is <a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_BITMAP</a>. Note that the address and content of the bitmap buffer can change between calls of <a href="ft2-base_interface.html#FT_Load_Glyph">FT_Load_Glyph</a> and a few other functions.</p>
+<p>This field is used as a bitmap descriptor. Note that the address and content of the bitmap buffer can change between calls of <a href="ft2-base_interface.html#FT_Load_Glyph">FT_Load_Glyph</a> and a few other functions.</p>
 </td></tr>
 <tr><td class="val" id="bitmap_left">bitmap_left</td><td class="desc">
-<p>The bitmap's left bearing expressed in integer pixels. Only valid if the format is <a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_BITMAP</a>, this is, if the glyph slot contains a bitmap.</p>
+<p>The bitmap's left bearing expressed in integer pixels.</p>
 </td></tr>
 <tr><td class="val" id="bitmap_top">bitmap_top</td><td class="desc">
 <p>The bitmap's top bearing expressed in integer pixels. This is the distance from the baseline to the top-most glyph scanline, upwards y&nbsp;coordinates being <b>positive</b>.</p>
 </table>
 
 <h4>note</h4>
-<p>If <a href="ft2-base_interface.html#FT_Load_Glyph">FT_Load_Glyph</a> is called with default flags (see <a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_DEFAULT</a>) the glyph image is loaded in the glyph slot in its native format (e.g., an outline glyph for TrueType and Type&nbsp;1 formats).</p>
+<p>If <a href="ft2-base_interface.html#FT_Load_Glyph">FT_Load_Glyph</a> is called with default flags (see <a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_DEFAULT</a>) the glyph image is loaded in the glyph slot in its native format (e.g., an outline glyph for TrueType and Type&nbsp;1 formats). [Since 2.9] The prospective bitmap metrics are calculated according to <a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_XXX</a> and other flags even for the outline glyph, even if <a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_RENDER</a> is not set.</p>
 <p>This image can later be converted into a bitmap by calling <a href="ft2-base_interface.html#FT_Render_Glyph">FT_Render_Glyph</a>. This function searches the current renderer for the native image's format, then invokes it.</p>
 <p>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 &lsquo;slot-&gt;bitmap&rsquo;.</p>
 <p>Note that &lsquo;slot-&gt;bitmap_left&rsquo; and &lsquo;slot-&gt;bitmap_top&rsquo; 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, &lsquo;slot-&gt;format&rsquo; is also changed to <a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_BITMAP</a>.</p>
      and add it to `origin_x'&gt;
 
     origin_x += slot-&gt;advance.x;
-    origin_x += slot-&gt;rsb_delta - slot-&gt;lsb_relta;
+    origin_x += slot-&gt;rsb_delta - slot-&gt;lsb_delta;
   endfor
 </pre>
 <p>Here is another small pseudo code fragment that shows how to use &lsquo;lsb_delta&rsquo; and &lsquo;rsb_delta&rsquo; to improve integer positioning of glyphs:</p>
 
     &lt;load glyph with `FT_Load_Glyph'&gt;
 
-    if ( prev_rsb_delta - slot-&gt;lsb_delta &gt;= 32 )
+    if ( prev_rsb_delta - slot-&gt;lsb_delta &gt;  32 )
       origin_x -= 64;
-    else if ( prev_rsb_delta - slot-&gt;lsb_delta &lt; -32 )
+    else if ( prev_rsb_delta - slot-&gt;lsb_delta &lt; -31 )
       origin_x += 64;
 
     prev_rsb_delta = slot-&gt;rsb_delta;
 <p>In case you want to provide your own memory allocating routines, use <a href="ft2-module_management.html#FT_New_Library">FT_New_Library</a> instead, followed by a call to <a href="ft2-module_management.html#FT_Add_Default_Modules">FT_Add_Default_Modules</a> (or a series of calls to <a href="ft2-module_management.html#FT_Add_Module">FT_Add_Module</a>) and <a href="ft2-module_management.html#FT_Set_Default_Properties">FT_Set_Default_Properties</a>.</p>
 <p>See the documentation of <a href="ft2-base_interface.html#FT_Library">FT_Library</a> and <a href="ft2-base_interface.html#FT_Face">FT_Face</a> for multi-threading issues.</p>
 <p>If you need reference-counting (cf. <a href="ft2-module_management.html#FT_Reference_Library">FT_Reference_Library</a>), use <a href="ft2-module_management.html#FT_New_Library">FT_New_Library</a> and <a href="ft2-module_management.html#FT_Done_Library">FT_Done_Library</a>.</p>
-<p>If compilation option FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES is set, this function reads the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable to control driver properties. See sections &lsquo;<a href="ft2-auto_hinter.html#auto_hinter">The auto-hinter</a>&rsquo;, &lsquo;<a href="ft2-cff_driver.html#cff_driver">The CFF driver</a>&rsquo;, &lsquo;<a href="ft2-pcf_driver.html#pcf_driver">The PCF driver</a>&rsquo;, and &lsquo;<a href="ft2-tt_driver.html#tt_driver">The TrueType driver</a>&rsquo; for more.</p>
+<p>If compilation option FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES is set, this function reads the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable to control driver properties. See section &lsquo;<a href="ft2-properties.html#properties">Driver properties</a>&rsquo; for more.</p>
 
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 <p>Set or override certain (library or module-wide) properties on a face-by-face basis. Useful for finer-grained control and avoiding locks on shared structures (threads can modify their own faces as they see fit).</p>
 <p>Contrary to <a href="ft2-module_management.html#FT_Property_Set">FT_Property_Set</a>, this function uses <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> so that you can pass multiple properties to the target face in one call. Note that only a subset of the available properties can be controlled.</p>
-<p>* Stem darkening (@FT_PARAM_TAG_STEM_DARKENING, corresponding to the property &lsquo;no-stem-darkening&rsquo; provided by the &lsquo;autofit&rsquo; and &lsquo;cff&rsquo; modules; see <a href="ft2-auto_hinter.html#no-stem-darkening(autofit)">no-stem-darkening</a> and <a href="ft2-cff_driver.html#no-stem-darkening(cff)">no-stem-darkening</a>).</p>
-<p>* LCD filter weights (@FT_PARAM_TAG_LCD_FILTER_WEIGHTS, corresponding to function <a href="ft2-lcd_filtering.html#FT_Library_SetLcdFilterWeights">FT_Library_SetLcdFilterWeights</a>).</p>
-<p>* Seed value for the CFF &lsquo;random&rsquo; operator (@FT_PARAM_TAG_RANDOM_SEED, corresponding to the &lsquo;random-seed&rsquo; property provided by the &lsquo;cff&rsquo; module; see <a href="ft2-cff_driver.html#random-seed">random-seed</a>).</p>
+<p>* <a href="ft2-parameter_tags.html#FT_PARAM_TAG_STEM_DARKENING">FT_PARAM_TAG_STEM_DARKENING</a> (stem darkening, corresponding to the property &lsquo;no-stem-darkening&rsquo; provided by the &lsquo;autofit&rsquo;, &lsquo;cff&rsquo;, &lsquo;type1&rsquo;, and &lsquo;t1cid&rsquo; modules; see <a href="ft2-properties.html#no-stem-darkening">no-stem-darkening</a>).</p>
+<p>* <a href="ft2-parameter_tags.html#FT_PARAM_TAG_LCD_FILTER_WEIGHTS">FT_PARAM_TAG_LCD_FILTER_WEIGHTS</a> (LCD filter weights, corresponding to function <a href="ft2-lcd_filtering.html#FT_Library_SetLcdFilterWeights">FT_Library_SetLcdFilterWeights</a>).</p>
+<p>* <a href="ft2-parameter_tags.html#FT_PARAM_TAG_RANDOM_SEED">FT_PARAM_TAG_RANDOM_SEED</a> (seed value for the CFF, Type&nbsp;1, and CID &lsquo;random&rsquo; operator, corresponding to the &lsquo;random-seed&rsquo; property provided by the &lsquo;cff&rsquo;, &lsquo;type1&rsquo;, and &lsquo;t1cid&rsquo; modules; see <a href="ft2-properties.html#random-seed">random-seed</a>).</p>
 <p>Pass NULL as &lsquo;data&rsquo; in <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> for a given tag to reset the option and use the library or module default again.</p>
 
 <h4>input</h4>
   FT_Face_Properties( face, 1, &amp;property );
 </pre>
 
+<h4>since</h4>
+<p>2.8</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 </td></tr>
 <tr><td class="val" id="face_index">face_index</td><td class="desc">
 <p>This field holds two different values. Bits 0-15 are the index of the face in the font file (starting with value&nbsp;0). Set it to&nbsp;0 if there is only one face in the font file.</p>
-<p>Bits 16-30 are relevant to GX and OpenType variation fonts only, specifying the named instance index for the current face index (starting with value&nbsp;1; value&nbsp;0 makes FreeType ignore named instances). For non-variation fonts, bits 16-30 are ignored. Assuming that you want to access the third named instance in face&nbsp;4, &lsquo;face_index&rsquo; should be set to 0x00030004. If you want to access face&nbsp;4 without variation handling, simply set &lsquo;face_index&rsquo; to value&nbsp;4.</p>
+<p>[Since 2.6.1] Bits 16-30 are relevant to GX and OpenType variation fonts only, specifying the named instance index for the current face index (starting with value&nbsp;1; value&nbsp;0 makes FreeType ignore named instances). For non-variation fonts, bits 16-30 are ignored. Assuming that you want to access the third named instance in face&nbsp;4, &lsquo;face_index&rsquo; should be set to 0x00030004. If you want to access face&nbsp;4 without variation handling, simply set &lsquo;face_index&rsquo; to value&nbsp;4.</p>
 <p>&lsquo;FT_Open_Face&rsquo; and its siblings can be used to quickly check whether the font format of a given font resource is supported by FreeType. In general, if the &lsquo;face_index&rsquo; argument is negative, the function's return value is&nbsp;0 if the font format is recognized, or non-zero otherwise. The function allocates a more or less empty face handle in &lsquo;*aface&rsquo; (if &lsquo;aface&rsquo; isn't NULL); the only two useful fields in this special case are &lsquo;face-&gt;num_faces&rsquo; and &lsquo;face-&gt;style_flags&rsquo;. For any negative value of &lsquo;face_index&rsquo;, &lsquo;face-&gt;num_faces&rsquo; gives the number of faces within the font file. For the negative value &lsquo;-(N+1)&rsquo; (with &lsquo;N&rsquo; a non-negative 16-bit value), bits 16-30 in &lsquo;face-&gt;style_flags&rsquo; give the number of named instances in face &lsquo;N&rsquo; if we have a variation font (or zero otherwise). After examination, the returned <a href="ft2-base_interface.html#FT_Face">FT_Face</a> structure should be deallocated with a call to <a href="ft2-base_interface.html#FT_Done_Face">FT_Done_Face</a>.</p>
 </td></tr>
 </table>
 </table>
 
 <h4>note</h4>
-<p>The LCD-optimized glyph bitmaps produced by &lsquo;FT_Render_Glyph&rsquo; can be filtered to reduce color-fringes by using <a href="ft2-lcd_filtering.html#FT_Library_SetLcdFilter">FT_Library_SetLcdFilter</a> (not active in the default builds). It is up to the caller to either call &lsquo;FT_Library_SetLcdFilter&rsquo; (if available) or do the filtering itself.</p>
+<p>Should you define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your &lsquo;ftoption.h&rsquo;, which enables patented ClearType-style rendering, the LCD-optimized glyph bitmaps should be filtered to reduce color fringes inherent to this technology. You can either set up LCD filtering with <a href="ft2-lcd_filtering.html#FT_Library_SetLcdFilter">FT_Library_SetLcdFilter</a> or <a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a>, or do the filtering yourself. The default FreeType LCD rendering technology does not require filtering.</p>
 <p>The selected render mode only affects vector glyphs of a font. Embedded bitmaps often have a different pixel mode like <a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_MONO</a>. You can use <a href="ft2-bitmap_handling.html#FT_Bitmap_Convert">FT_Bitmap_Convert</a> to transform them into 8-bit pixmaps.</p>
 
 <hr>
 <h4>note</h4>
 <p>The returned pointer is owned by the face and is destroyed with it.</p>
 <p>For variation fonts, this string changes if you select a different instance, and you have to call &lsquo;FT_Get_PostScript_Name&rsquo; again to retrieve it. FreeType follows Adobe TechNote #5902, &lsquo;Generating PostScript Names for Fonts Using OpenType Font Variations&rsquo;.</p>
-<p><a href="http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5902.AdobePSNameGeneration.html">http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5902.AdobePSNameGeneration.html</a></p>
+<p><a href="https://download.macromedia.com/pub/developer/opentype/tech-notes/5902.AdobePSNameGeneration.html">https://download.macromedia.com/pub/developer/opentype/tech-notes/5902.AdobePSNameGeneration.html</a></p>
+<p>[Since 2.9] Special PostScript names for named instances are only returned if the named instance is set with <a href="ft2-multiple_masters.html#FT_Set_Named_Instance">FT_Set_Named_Instance</a> (and the font has corresponding entries in its &lsquo;fvar&rsquo; table). If <a href="ft2-base_interface.html#FT_IS_VARIATION">FT_IS_VARIATION</a> returns true, the algorithmically derived PostScript name is provided, not looking up special entries for named instances.</p>
 
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 #define <a href="ft2-base_interface.html#FT_FACE_FLAG_CID_KEYED">FT_FACE_FLAG_CID_KEYED</a>         ( 1L &lt;&lt; 12 )
 #define <a href="ft2-base_interface.html#FT_FACE_FLAG_TRICKY">FT_FACE_FLAG_TRICKY</a>            ( 1L &lt;&lt; 13 )
 #define <a href="ft2-base_interface.html#FT_FACE_FLAG_COLOR">FT_FACE_FLAG_COLOR</a>             ( 1L &lt;&lt; 14 )
+#define <a href="ft2-base_interface.html#FT_FACE_FLAG_VARIATION">FT_FACE_FLAG_VARIATION</a>         ( 1L &lt;&lt; 15 )
 </pre>
 
 <p>A list of bit flags used in the &lsquo;face_flags&rsquo; field of the <a href="ft2-base_interface.html#FT_FaceRec">FT_FaceRec</a> structure. They inform client applications of properties of the corresponding face.</p>
 <p>Currently, there are about a dozen TrueType fonts in the list of tricky fonts; they are hard-coded in file &lsquo;ttobjs.c&rsquo;.</p>
 </td></tr>
 <tr><td class="val" id="FT_FACE_FLAG_COLOR">FT_FACE_FLAG_COLOR</td><td class="desc">
-<p>The face has color glyph tables. To access color glyphs use <a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_COLOR</a>.</p>
+<p>[Since 2.5.1] The face has color glyph tables. To access color glyphs use <a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_COLOR</a>.</p>
+</td></tr>
+<tr><td class="val" id="FT_FACE_FLAG_VARIATION">FT_FACE_FLAG_VARIATION</td><td class="desc">
+<p>[Since 2.9] Set if the current face (or named instance) has been altered with <a href="ft2-multiple_masters.html#FT_Set_MM_Design_Coordinates">FT_Set_MM_Design_Coordinates</a>, <a href="ft2-multiple_masters.html#FT_Set_Var_Design_Coordinates">FT_Set_Var_Design_Coordinates</a>, or <a href="ft2-multiple_masters.html#FT_Set_Var_Blend_Coordinates">FT_Set_Var_Blend_Coordinates</a>. This flag is unset by a call to <a href="ft2-multiple_masters.html#FT_Set_Named_Instance">FT_Set_Named_Instance</a>.</p>
 </td></tr>
 </table>
 
 <p>Disable the auto-hinter. See also the note below.</p>
 </td></tr>
 <tr><td class="val" id="FT_LOAD_COLOR">FT_LOAD_COLOR</td><td class="desc">
-<p>Load embedded color bitmap images. The resulting color bitmaps, if available, will have the <a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_BGRA</a> format. If the flag is not set and color bitmaps are found, they are converted to 256-level gray bitmaps transparently, using the <a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_GRAY</a> format.</p>
+<p>[Since 2.5] Load embedded color bitmap images. The resulting color bitmaps, if available, will have the <a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_BGRA</a> format. If the flag is not set and color bitmaps are found, they are converted to 256-level gray bitmaps transparently, using the <a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_GRAY</a> format.</p>
 </td></tr>
 <tr><td class="val" id="FT_LOAD_COMPUTE_METRICS">FT_LOAD_COMPUTE_METRICS</td><td class="desc">
-<p>Compute glyph metrics from the glyph data, without the use of bundled metrics tables (for example, the &lsquo;hdmx&rsquo; table in TrueType fonts). This flag is mainly used by font validating or font editing applications, which need to ignore, verify, or edit those tables.</p>
+<p>[Since 2.6.1] Compute glyph metrics from the glyph data, without the use of bundled metrics tables (for example, the &lsquo;hdmx&rsquo; table in TrueType fonts). This flag is mainly used by font validating or font editing applications, which need to ignore, verify, or edit those tables.</p>
 <p>Currently, this flag is only implemented for TrueType fonts.</p>
 </td></tr>
 <tr><td class="val" id="FT_LOAD_BITMAP_METRICS_ONLY">FT_LOAD_BITMAP_METRICS_ONLY</td><td class="desc">
-<p>Request loading of the metrics and bitmap image information of a (possibly embedded) bitmap glyph without allocating or copying the bitmap image data itself. No effect if the target glyph is not a bitmap image.</p>
+<p>[Since 2.7.1] Request loading of the metrics and bitmap image information of a (possibly embedded) bitmap glyph without allocating or copying the bitmap image data itself. No effect if the target glyph is not a bitmap image.</p>
 <p>This flag unsets <a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_RENDER</a>.</p>
 </td></tr>
 <tr><td class="val" id="FT_LOAD_CROP_BITMAP">FT_LOAD_CROP_BITMAP</td><td class="desc">
 </pre>
 
 <p>A list of bit flags used in the &lsquo;fsType&rsquo; field of the OS/2 table in a TrueType or OpenType font and the &lsquo;FSType&rsquo; entry in a PostScript font. These bit flags are returned by <a href="ft2-base_interface.html#FT_Get_FSType_Flags">FT_Get_FSType_Flags</a>; they inform client applications of embedding and subsetting restrictions associated with a font.</p>
-<p>See <a href="http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf">http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf</a> for more details.</p>
+<p>See <a href="https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf">https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf</a> for more details.</p>
 
 <h4>values</h4>
 <table class="fields">
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
-<div class="section">
-<h3 id="FT_IS_NAMED_INSTANCE">FT_IS_NAMED_INSTANCE</h3>
-<p>Defined in FT_FREETYPE_H (freetype/freetype.h).</p>
-<pre>
-#define <b>FT_IS_NAMED_INSTANCE</b>( face ) \
-          ( (face)-&gt;face_index &amp; 0x7FFF0000L )
-</pre>
-
-<p>A macro that returns true whenever a face object is a named instance of a GX or OpenType variation font.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
 </body>
 </html>
index 7abf969..17bb0aa 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="basic_types">Basic Data Types</h1>
 <h2>Synopsis</h2>
 <h3 id="FT_Generic_Finalizer">FT_Generic_Finalizer</h3>
 <p>Defined in FT_TYPES_H (freetype/fttypes.h).</p>
 <pre>
-  <span class="keyword">typedef</span> <span class="keyword">void</span>  (*<b>FT_Generic_Finalizer</b>)(<span class="keyword">void</span>*  object);
+  <span class="keyword">typedef</span> <span class="keyword">void</span>  (*<b>FT_Generic_Finalizer</b>)( <span class="keyword">void</span>*  object );
 </pre>
 
 <p>Describe a function used to destroy the &lsquo;client&rsquo; data of any FreeType object. See the description of the <a href="ft2-basic_types.html#FT_Generic">FT_Generic</a> type for details of usage.</p>
 <p>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 <a href="ft2-base_interface.html#FT_Render_Mode">FT_RENDER_MODE_LCD_V</a>.</p>
 </td></tr>
 <tr><td class="val" id="FT_PIXEL_MODE_BGRA">FT_PIXEL_MODE_BGRA</td><td class="desc">
-<p>An image with four 8-bit channels per pixel, representing a color image (such as emoticons) with alpha channel. For each pixel, the format is BGRA, which means, the blue channel comes first in memory. The color channels are pre-multiplied and in the sRGB colorspace. For example, full red at half-translucent opacity will be represented as &lsquo;00,00,80,80&rsquo;, not &lsquo;00,00,FF,80&rsquo;. See also <a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_COLOR</a>.</p>
+<p>[Since 2.5] An image with four 8-bit channels per pixel, representing a color image (such as emoticons) with alpha channel. For each pixel, the format is BGRA, which means, the blue channel comes first in memory. The color channels are pre-multiplied and in the sRGB colorspace. For example, full red at half-translucent opacity will be represented as &lsquo;00,00,80,80&rsquo;, not &lsquo;00,00,FF,80&rsquo;. See also <a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_COLOR</a>.</p>
 </td></tr>
 </table>
 
 <p>The glyph image is a bitmap, and can be described as an <a href="ft2-basic_types.html#FT_Bitmap">FT_Bitmap</a>. You generally need to access the &lsquo;bitmap&rsquo; field of the <a href="ft2-base_interface.html#FT_GlyphSlotRec">FT_GlyphSlotRec</a> structure to read it.</p>
 </td></tr>
 <tr><td class="val" id="FT_GLYPH_FORMAT_OUTLINE">FT_GLYPH_FORMAT_OUTLINE</td><td class="desc">
-<p>The glyph image is a vectorial outline made of line segments and Bézier arcs; it can be described as an <a href="ft2-outline_processing.html#FT_Outline">FT_Outline</a>; you generally want to access the &lsquo;outline&rsquo; field of the <a href="ft2-base_interface.html#FT_GlyphSlotRec">FT_GlyphSlotRec</a> structure to read it.</p>
+<p>The glyph image is a vectorial outline made of line segments and Bezier arcs; it can be described as an <a href="ft2-outline_processing.html#FT_Outline">FT_Outline</a>; you generally want to access the &lsquo;outline&rsquo; field of the <a href="ft2-base_interface.html#FT_GlyphSlotRec">FT_GlyphSlotRec</a> structure to read it.</p>
 </td></tr>
 <tr><td class="val" id="FT_GLYPH_FORMAT_PLOTTER">FT_GLYPH_FORMAT_PLOTTER</td><td class="desc">
 <p>The glyph image is a vectorial path with no inside and outside contours. Some Type&nbsp;1 fonts, like those in the Hershey family, contain glyphs in this format. These are described as <a href="ft2-outline_processing.html#FT_Outline">FT_Outline</a>, but FreeType isn't currently capable of rendering them correctly.</p>
index be1a4a9..eef42aa 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="bdf_fonts">BDF and PCF Files</h1>
 <h2>Synopsis</h2>
index f8556fe..bf0bc93 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="bitmap_handling">Bitmap Handling</h1>
 <h2>Synopsis</h2>
   FT_EXPORT( <a href="ft2-basic_types.html#FT_Error">FT_Error</a> )
   <b>FT_Bitmap_Copy</b>( <a href="ft2-base_interface.html#FT_Library">FT_Library</a>        library,
                   <span class="keyword">const</span> <a href="ft2-basic_types.html#FT_Bitmap">FT_Bitmap</a>  *source,
-                  <a href="ft2-basic_types.html#FT_Bitmap">FT_Bitmap</a>        *target);
+                  <a href="ft2-basic_types.html#FT_Bitmap">FT_Bitmap</a>        *target );
 </pre>
 
 <p>Copy a bitmap into another one.</p>
index 4e8e9b2..b11b484 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="bzip2">BZIP2 Streams</h1>
 <h2>Synopsis</h2>
index 385453a..4cc074a 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="cache_subsystem">Cache Sub-System</h1>
 <h2>Synopsis</h2>
index 3b91ab1..70c60ee 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="cff_driver">The CFF driver</h1>
-<h2>Synopsis</h2>
-<table class="synopsis">
-<tr><td><a href="#hinting-engine(cff)">hinting-engine</a></td><td>&nbsp;</td></tr>
-<tr><td><a href="#no-stem-darkening(cff)">no-stem-darkening</a></td><td><a href="#FT_CFF_HINTING_XXX">FT_CFF_HINTING_XXX</a></td></tr>
-<tr><td><a href="#darkening-parameters(cff)">darkening-parameters</a></td><td><a href="#FT_PARAM_TAG_RANDOM_SEED">FT_PARAM_TAG_RANDOM_SEED</a></td></tr>
-<tr><td><a href="#random-seed">random-seed</a></td><td></td></tr>
-</table>
 
-
-<p>While FreeType's CFF driver doesn't expose API functions by itself, it is possible to control its behaviour with <a href="ft2-module_management.html#FT_Property_Set">FT_Property_Set</a> and <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a>. The list below gives the available properties together with the necessary macros and structures.</p>
+<p>While FreeType's CFF driver doesn't expose API functions by itself, it is possible to control its behaviour with <a href="ft2-module_management.html#FT_Property_Set">FT_Property_Set</a> and <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a>.</p>
 <p>The CFF driver's module name is &lsquo;cff&rsquo;.</p>
+<p>Available properties are <a href="ft2-properties.html#hinting-engine">hinting-engine</a>, <a href="ft2-properties.html#no-stem-darkening">no-stem-darkening</a>, <a href="ft2-properties.html#darkening-parameters">darkening-parameters</a>, and <a href="ft2-properties.html#random-seed">random-seed</a>, as documented in the &lsquo;<a href="ft2-properties.html#properties">Driver properties</a>&rsquo; section.</p>
 <p><b>Hinting</b> <b>and</b> <b>antialiasing</b> <b>principles</b> <b>of</b> <b>the</b> <b>new</b> <b>engine</b></p>
 <p>The rasterizer is positioning horizontal features (e.g., ascender height &amp; x-height, or crossbars) on the pixel grid and minimizing the amount of antialiasing applied to them, while placing vertical features (vertical stems) on the pixel grid without hinting, thus representing the stem position and weight accurately. Sometimes the vertical stems may be only partially black. In this context, &lsquo;antialiasing&rsquo; means that stems are not positioned exactly on pixel borders, causing a fuzzy appearance.</p>
 <p>There are two principles behind this approach.</p>
 <p>On the technical side, horizontal alignment zones for ascender, x-height, and other important height values (traditionally called &lsquo;blue zones&rsquo;) as defined in the font are positioned independently, each being rounded to the nearest pixel edge, taking care of overshoot suppression at small sizes, stem darkening, and scaling.</p>
 <p>Hstems (this is, hint values defined in the font to help align horizontal features) that fall within a blue zone are said to be &lsquo;captured&rsquo; and are aligned to that zone. Uncaptured stems are moved in one of four ways, top edge up or down, bottom edge up or down. Unless there are conflicting hstems, the smallest movement is taken to minimize distortion.</p>
 
-<div class="section">
-<h3 id="hinting-engine(cff)">hinting-engine</h3>
-
-<p>Thanks to Adobe, which contributed a new hinting (and parsing) engine, an application can select between &lsquo;freetype&rsquo; and &lsquo;adobe&rsquo; if compiled with CFF_CONFIG_OPTION_OLD_ENGINE. If this configuration macro isn't defined, &lsquo;hinting-engine&rsquo; does nothing.</p>
-<p>The default engine is &lsquo;freetype&rsquo; if CFF_CONFIG_OPTION_OLD_ENGINE is defined, and &lsquo;adobe&rsquo; otherwise.</p>
-<p>The following example code demonstrates how to select Adobe's hinting engine (omitting the error handling).</p>
-<pre class="colored">
-  FT_Library  library;
-  FT_UInt     hinting_engine = FT_CFF_HINTING_ADOBE;
-
-
-  FT_Init_FreeType( &amp;library );
-
-  FT_Property_Set( library, "cff",
-                            "hinting-engine", &amp;hinting_engine );
-</pre>
-
-<h4>note</h4>
-<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
-<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable (using values &lsquo;adobe&rsquo; or &lsquo;freetype&rsquo;).</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="no-stem-darkening(cff)">no-stem-darkening</h3>
-
-<p>By default, the Adobe CFF engine darkens stems at smaller sizes, regardless of hinting, to enhance contrast. This feature requires a rendering system with proper gamma correction. Setting this property, stem darkening gets switched off.</p>
-<p>Note that stem darkening is never applied if <a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_NO_SCALE</a> is set.</p>
-<pre class="colored">
-  FT_Library  library;
-  FT_Bool     no_stem_darkening = TRUE;
-
-
-  FT_Init_FreeType( &amp;library );
-
-  FT_Property_Set( library, "cff",
-                            "no-stem-darkening", &amp;no_stem_darkening );
-</pre>
-
-<h4>note</h4>
-<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
-<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable (using values 1 and 0 for &lsquo;on&rsquo; and &lsquo;off&rsquo;, respectively). It can also be set per face using <a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a> with <a href="ft2-auto_hinter.html#FT_PARAM_TAG_STEM_DARKENING">FT_PARAM_TAG_STEM_DARKENING</a>.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="darkening-parameters(cff)">darkening-parameters</h3>
-
-<p>By default, the Adobe CFF engine darkens stems as follows (if the &lsquo;no-stem-darkening&rsquo; property isn't set):</p>
-<pre class="colored">
-  stem width &lt;= 0.5px:   darkening amount = 0.4px
-  stem width  = 1px:     darkening amount = 0.275px
-  stem width  = 1.667px: darkening amount = 0.275px
-  stem width &gt;= 2.333px: darkening amount = 0px
-</pre>
-<p>and piecewise linear in-between. At configuration time, these four control points can be set with the macro &lsquo;CFF_CONFIG_OPTION_DARKENING_PARAMETERS&rsquo;. At runtime, the control points can be changed using the &lsquo;darkening-parameters&rsquo; property, as the following example demonstrates.</p>
-<pre class="colored">
-  FT_Library  library;
-  FT_Int      darken_params[8] = {  500, 300,   // x1, y1
-                                   1000, 200,   // x2, y2
-                                   1500, 100,   // x3, y3
-                                   2000,   0 }; // x4, y4
-
-
-  FT_Init_FreeType( &amp;library );
-
-  FT_Property_Set( library, "cff",
-                            "darkening-parameters", darken_params );
-</pre>
-<p>The x&nbsp;values give the stem width, and the y&nbsp;values the darkening amount. The unit is 1000th of pixels. All coordinate values must be positive; the x&nbsp;values must be monotonically increasing; the y&nbsp;values must be monotonically decreasing and smaller than or equal to 500 (corresponding to half a pixel); the slope of each linear piece must be shallower than -1 (e.g., -.4).</p>
-
-<h4>note</h4>
-<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
-<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable, using eight comma-separated integers without spaces. Here the above example, using &lsquo;\&rsquo; to break the line for readability.</p>
-<pre class="colored">
-  FREETYPE_PROPERTIES=\
-  cff:darkening-parameters=500,300,1000,200,1500,100,2000,0
-</pre>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="random-seed">random-seed</h3>
-
-<p>By default, the seed value for the CFF &lsquo;random&rsquo; operator is set to a random value. However, mainly for debugging purposes, it is often necessary to use a known value as a seed so that the pseudo-random number sequences generated by &lsquo;random&rsquo; are repeatable.</p>
-<p>The &lsquo;random-seed&rsquo; property does that. Its argument is a signed 32bit integer; if the value is zero or negative, the seed given by the &lsquo;intitialRandomSeed&rsquo; private DICT operator in a CFF file gets used (or a default value if there is no such operator). If the value is positive, use it instead of &lsquo;initialRandomSeed&rsquo;, which is consequently ignored.</p>
-
-<h4>note</h4>
-<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable. It can also be set per face using <a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a> with <a href="ft2-cff_driver.html#FT_PARAM_TAG_RANDOM_SEED">FT_PARAM_TAG_RANDOM_SEED</a>.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="FT_CFF_HINTING_XXX">FT_CFF_HINTING_XXX</h3>
-<p>Defined in FT_CFF_DRIVER_H (freetype/ftcffdrv.h).</p>
-<pre>
-#define <a href="ft2-cff_driver.html#FT_CFF_HINTING_FREETYPE">FT_CFF_HINTING_FREETYPE</a>  0
-#define <a href="ft2-cff_driver.html#FT_CFF_HINTING_ADOBE">FT_CFF_HINTING_ADOBE</a>     1
-</pre>
-
-<p>A list of constants used for the <a href="ft2-cff_driver.html#hinting-engine(cff)">hinting-engine</a> property to select the hinting engine for CFF fonts.</p>
-
-<h4>values</h4>
-<table class="fields">
-<tr><td class="val" id="FT_CFF_HINTING_FREETYPE">FT_CFF_HINTING_FREETYPE</td><td class="desc">
-<p>Use the old FreeType hinting engine.</p>
-</td></tr>
-<tr><td class="val" id="FT_CFF_HINTING_ADOBE">FT_CFF_HINTING_ADOBE</td><td class="desc">
-<p>Use the hinting engine contributed by Adobe.</p>
-</td></tr>
-</table>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="FT_PARAM_TAG_RANDOM_SEED">FT_PARAM_TAG_RANDOM_SEED</h3>
-<p>Defined in FT_CFF_DRIVER_H (freetype/ftcffdrv.h).</p>
-<pre>
-#define <b>FT_PARAM_TAG_RANDOM_SEED</b> \
-          <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 's', 'e', 'e', 'd' )
-</pre>
-
-<p>An <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> tag to be used with <a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a>. The corresponding 32bit signed integer argument overrides the CFF module's random seed value with a face-specific one; see <a href="ft2-cff_driver.html#random-seed">random-seed</a>.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
 </body>
 </html>
index e8d8188..f342e93 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="cid_fonts">CID Fonts</h1>
 <h2>Synopsis</h2>
   <b>FT_Get_CID_Registry_Ordering_Supplement</b>( <a href="ft2-base_interface.html#FT_Face">FT_Face</a>       face,
                                            <span class="keyword">const</span> <span class="keyword">char</span>*  *registry,
                                            <span class="keyword">const</span> <span class="keyword">char</span>*  *ordering,
-                                           <a href="ft2-basic_types.html#FT_Int">FT_Int</a>       *supplement);
+                                           <a href="ft2-basic_types.html#FT_Int">FT_Int</a>       *supplement );
 </pre>
 
 <p>Retrieve the Registry/Ordering/Supplement triple (also known as the "R/O/S") from a CID-keyed font.</p>
index cd998fe..400adb9 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="computations">Computations</h1>
 <h2>Synopsis</h2>
 <h4>return</h4>
 <p>&lsquo;a&rsquo; rounded to the nearest 16.16 fixed integer, halfway cases away from zero.</p>
 
+<h4>note</h4>
+<p>The function uses wrap-around arithmetic.</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 <h4>return</h4>
 <p>&lsquo;a&rsquo; rounded towards plus infinity.</p>
 
+<h4>note</h4>
+<p>The function uses wrap-around arithmetic.</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 
 <h4>note</h4>
 <p>The result is undefined if either &lsquo;a&rsquo; or &lsquo;b&rsquo; is zero.</p>
+<p>Since the function uses wrap-around arithmetic, results become meaningless if the arguments are very large.</p>
 
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
index 2c5af61..f28b89f 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="error_code_values">Error Code Values</h1>
 <h2>Synopsis</h2>
                 "invalid PostScript (post) table" )
   FT_ERRORDEF_( DEF_In_Glyf_Bytecode,                        0x9C,
                 "found FDEF or IDEF opcode in glyf bytecode" )
+  FT_ERRORDEF_( Missing_Bitmap,                              0x9D,
+                "missing bitmap in strike" )
 
   /* CFF, CID, and Type 1 errors */
 
index b0f68e0..0353758 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="error_enumerations">Error Enumerations</h1>
 
 <p>The header file &lsquo;fterrors.h&rsquo; (which is automatically included by &lsquo;freetype.h&rsquo; defines the handling of FreeType's enumeration constants. It can also be used to generate error message strings with a small macro trick explained below.</p>
 <p><b>Error</b> <b>Formats</b></p>
-<p>The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be defined in &lsquo;ftoption.h&rsquo; in order to make the higher byte indicate the module where the error has happened (this is not compatible with standard builds of FreeType&amp;nbsp;2, however). See the file &lsquo;ftmoderr.h&rsquo; for more details.</p>
+<p>The configuration macro FT_CONFIG_OPTION_USE_MODULE_ERRORS can be defined in &lsquo;ftoption.h&rsquo; in order to make the higher byte indicate the module where the error has happened (this is not compatible with standard builds of FreeType&nbsp;2, however). See the file &lsquo;ftmoderr.h&rsquo; for more details.</p>
 <p><b>Error</b> <b>Message</b> <b>Strings</b></p>
-<p>Error definitions are set up with special macros that allow client applications to build a table of error message strings. The strings are not included in a normal build of FreeType&amp;nbsp;2 to save space (most client applications do not use them).</p>
+<p>Error definitions are set up with special macros that allow client applications to build a table of error message strings. The strings are not included in a normal build of FreeType&nbsp;2 to save space (most client applications do not use them).</p>
 <p>To do so, you have to define the following macros before including this file.</p>
 <pre class="colored">
   FT_ERROR_START_LIST
index d23d79d..1ff4f50 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="font_formats">Font Formats</h1>
 <h2>Synopsis</h2>
index 7a998fb..74351e9 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="gasp_table">Gasp Table</h1>
 <h2>Synopsis</h2>
index c934a95..36643aa 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="glyph_management">Glyph Management</h1>
 <h2>Synopsis</h2>
 <h4>return</h4>
 <p>FreeType error code. 0&nbsp;means success.</p>
 
+<h4>note</h4>
+<p>Because &lsquo;*aglyph-&gt;advance.x&rsquo; and '*aglyph-&gt;advance.y' are 16.16 fixed-point numbers, &lsquo;slot-&gt;advance.x&rsquo; and &lsquo;slot-&gt;advance.y&rsquo; (which are in 26.6 fixed-point format) must be in the range ]-32768;32768[.</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
                      <a href="ft2-basic_types.html#FT_BBox">FT_BBox</a>  *acbox );
 </pre>
 
-<p>Return a glyph's &lsquo;control box&rsquo;. 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 that contains Bézier outside arcs).</p>
+<p>Return a glyph's &lsquo;control box&rsquo;. The control box encloses all the outline's points, including Bezier 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 that contains Bezier outside arcs).</p>
 <p>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 &lsquo;ftbbox&rsquo; component, which is dedicated to this single task.</p>
 
 <h4>input</h4>
index f9c2312..bd1c382 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="glyph_stroker">Glyph Stroker</h1>
 <h2>Synopsis</h2>
                       <a href="ft2-basic_types.html#FT_Vector">FT_Vector</a>*  to );
 </pre>
 
-<p>&lsquo;Draw&rsquo; a single quadratic Bézier in the stroker's current sub-path, from the last position.</p>
+<p>&lsquo;Draw&rsquo; a single quadratic Bezier in the stroker's current sub-path, from the last position.</p>
 
 <h4>input</h4>
 <table class="fields">
 <p>The target stroker handle.</p>
 </td></tr>
 <tr><td class="val" id="control">control</td><td class="desc">
-<p>A pointer to a Bézier control point.</p>
+<p>A pointer to a Bezier control point.</p>
 </td></tr>
 <tr><td class="val" id="to">to</td><td class="desc">
 <p>A pointer to the destination point.</p>
                       <a href="ft2-basic_types.html#FT_Vector">FT_Vector</a>*  to );
 </pre>
 
-<p>&lsquo;Draw&rsquo; a single cubic Bézier in the stroker's current sub-path, from the last position.</p>
+<p>&lsquo;Draw&rsquo; a single cubic Bezier in the stroker's current sub-path, from the last position.</p>
 
 <h4>input</h4>
 <table class="fields">
 <p>The target stroker handle.</p>
 </td></tr>
 <tr><td class="val" id="control1">control1</td><td class="desc">
-<p>A pointer to the first Bézier control point.</p>
+<p>A pointer to the first Bezier control point.</p>
 </td></tr>
 <tr><td class="val" id="control2">control2</td><td class="desc">
-<p>A pointer to second Bézier control point.</p>
+<p>A pointer to second Bezier control point.</p>
 </td></tr>
 <tr><td class="val" id="to">to</td><td class="desc">
 <p>A pointer to the destination point.</p>
index d6b6210..db49655 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="glyph_variants">Unicode Variation Sequences</h1>
 <h2>Synopsis</h2>
 
 <p>Many characters, especially for CJK scripts, 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 Variation Sequences (VS), consisting of a Unicode base character and a variation selector instead of further extending the already huge number of characters.</p>
 <p>Unicode maintains two different sets, namely &lsquo;Standardized Variation Sequences&rsquo; and registered &lsquo;Ideographic Variation Sequences&rsquo; (IVS), collected in the &lsquo;Ideographic Variation Database&rsquo; (IVD).</p>
-<p><a href="http://unicode.org/Public/UCD/latest/ucd/StandardizedVariants.txt">http://unicode.org/Public/UCD/latest/ucd/StandardizedVariants.txt</a> <a href="http://unicode.org/reports/tr37/">http://unicode.org/reports/tr37/</a> <a href="http://unicode.org/ivd/">http://unicode.org/ivd/</a></p>
+<p><a href="https://unicode.org/Public/UCD/latest/ucd/StandardizedVariants.txt">https://unicode.org/Public/UCD/latest/ucd/StandardizedVariants.txt</a> <a href="https://unicode.org/reports/tr37/">https://unicode.org/reports/tr37/</a> <a href="https://unicode.org/ivd/">https://unicode.org/ivd/</a></p>
 <p>To date (January 2017), the character with the most ideographic variations is U+9089, having 32 such IVS.</p>
 <p>Three Mongolian Variation Selectors have the values U+180B-U+180D; 256 generic Variation Selectors are encoded in the ranges U+FE00-U+FE0F and U+E0100-U+E01EF. IVS currently use Variation Selectors from the range U+E0100-U+E01EF only.</p>
 <p>A VS consists of the base character value followed by a single Variation Selector. For example, to get the first variation of U+9089, you have to write the character sequence &lsquo;U+9089 U+E0100&rsquo;.</p>
index cb99e1d..c7ddd56 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="gx_validation">TrueTypeGX/AAT Validation</h1>
 <h2>Synopsis</h2>
 <h3 id="FT_VALIDATE_GX_LENGTH">FT_VALIDATE_GX_LENGTH</h3>
 <p>Defined in FT_GX_VALIDATE_H (freetype/ftgxval.h).</p>
 <pre>
-#define <b>FT_VALIDATE_GX_LENGTH</b>     (FT_VALIDATE_GX_LAST_INDEX + 1)
+#define <b>FT_VALIDATE_GX_LENGTH</b>  ( FT_VALIDATE_GX_LAST_INDEX + 1 )
 </pre>
 
 <p>The number of tables checked in this module. Use it as a parameter for the &lsquo;table-length&rsquo; argument of function <a href="ft2-gx_validation.html#FT_TrueTypeGX_Validate">FT_TrueTypeGX_Validate</a>.</p>
index dd763ee..d88ee08 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="gzip">GZIP Streams</h1>
 <h2>Synopsis</h2>
 <h4>note</h4>
 <p>This function may return &lsquo;FT_Err_Unimplemented_Feature&rsquo; if your build of FreeType was not compiled with zlib support.</p>
 
+<h4>since</h4>
+<p>2.5.1</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
index 6ad35c3..26e34d7 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="header_file_macros">Header File Macros</h1>
 <h2>Synopsis</h2>
 <table class="synopsis">
-<tr><td><a href="#FT_CONFIG_CONFIG_H">FT_CONFIG_CONFIG_H</a></td><td><a href="#FT_LZW_H">FT_LZW_H</a></td></tr>
-<tr><td><a href="#FT_CONFIG_STANDARD_LIBRARY_H">FT_CONFIG_STANDARD_LIBRARY_H</a></td><td><a href="#FT_BZIP2_H">FT_BZIP2_H</a></td></tr>
-<tr><td><a href="#FT_CONFIG_OPTIONS_H">FT_CONFIG_OPTIONS_H</a></td><td><a href="#FT_WINFONTS_H">FT_WINFONTS_H</a></td></tr>
-<tr><td><a href="#FT_CONFIG_MODULES_H">FT_CONFIG_MODULES_H</a></td><td><a href="#FT_GLYPH_H">FT_GLYPH_H</a></td></tr>
-<tr><td><a href="#FT_FREETYPE_H">FT_FREETYPE_H</a></td><td><a href="#FT_BITMAP_H">FT_BITMAP_H</a></td></tr>
-<tr><td><a href="#FT_ERRORS_H">FT_ERRORS_H</a></td><td><a href="#FT_BBOX_H">FT_BBOX_H</a></td></tr>
-<tr><td><a href="#FT_MODULE_ERRORS_H">FT_MODULE_ERRORS_H</a></td><td><a href="#FT_CACHE_H">FT_CACHE_H</a></td></tr>
-<tr><td><a href="#FT_SYSTEM_H">FT_SYSTEM_H</a></td><td><a href="#FT_CACHE_IMAGE_H">FT_CACHE_IMAGE_H</a></td></tr>
-<tr><td><a href="#FT_IMAGE_H">FT_IMAGE_H</a></td><td><a href="#FT_CACHE_SMALL_BITMAPS_H">FT_CACHE_SMALL_BITMAPS_H</a></td></tr>
-<tr><td><a href="#FT_TYPES_H">FT_TYPES_H</a></td><td><a href="#FT_CACHE_CHARMAP_H">FT_CACHE_CHARMAP_H</a></td></tr>
+<tr><td><a href="#FT_CONFIG_CONFIG_H">FT_CONFIG_CONFIG_H</a></td><td><a href="#FT_BDF_H">FT_BDF_H</a></td></tr>
+<tr><td><a href="#FT_CONFIG_STANDARD_LIBRARY_H">FT_CONFIG_STANDARD_LIBRARY_H</a></td><td><a href="#FT_CID_H">FT_CID_H</a></td></tr>
+<tr><td><a href="#FT_CONFIG_OPTIONS_H">FT_CONFIG_OPTIONS_H</a></td><td><a href="#FT_GZIP_H">FT_GZIP_H</a></td></tr>
+<tr><td><a href="#FT_CONFIG_MODULES_H">FT_CONFIG_MODULES_H</a></td><td><a href="#FT_LZW_H">FT_LZW_H</a></td></tr>
+<tr><td><a href="#FT_FREETYPE_H">FT_FREETYPE_H</a></td><td><a href="#FT_BZIP2_H">FT_BZIP2_H</a></td></tr>
+<tr><td><a href="#FT_ERRORS_H">FT_ERRORS_H</a></td><td><a href="#FT_WINFONTS_H">FT_WINFONTS_H</a></td></tr>
+<tr><td><a href="#FT_MODULE_ERRORS_H">FT_MODULE_ERRORS_H</a></td><td><a href="#FT_GLYPH_H">FT_GLYPH_H</a></td></tr>
+<tr><td><a href="#FT_SYSTEM_H">FT_SYSTEM_H</a></td><td><a href="#FT_BITMAP_H">FT_BITMAP_H</a></td></tr>
+<tr><td><a href="#FT_IMAGE_H">FT_IMAGE_H</a></td><td><a href="#FT_BBOX_H">FT_BBOX_H</a></td></tr>
+<tr><td><a href="#FT_TYPES_H">FT_TYPES_H</a></td><td><a href="#FT_CACHE_H">FT_CACHE_H</a></td></tr>
 <tr><td><a href="#FT_LIST_H">FT_LIST_H</a></td><td><a href="#FT_MAC_H">FT_MAC_H</a></td></tr>
 <tr><td><a href="#FT_OUTLINE_H">FT_OUTLINE_H</a></td><td><a href="#FT_MULTIPLE_MASTERS_H">FT_MULTIPLE_MASTERS_H</a></td></tr>
 <tr><td><a href="#FT_SIZES_H">FT_SIZES_H</a></td><td><a href="#FT_SFNT_NAMES_H">FT_SFNT_NAMES_H</a></td></tr>
 <tr><td><a href="#FT_MODULE_H">FT_MODULE_H</a></td><td><a href="#FT_OPENTYPE_VALIDATE_H">FT_OPENTYPE_VALIDATE_H</a></td></tr>
 <tr><td><a href="#FT_RENDER_H">FT_RENDER_H</a></td><td><a href="#FT_GX_VALIDATE_H">FT_GX_VALIDATE_H</a></td></tr>
-<tr><td><a href="#FT_AUTOHINTER_H">FT_AUTOHINTER_H</a></td><td><a href="#FT_PFR_H">FT_PFR_H</a></td></tr>
-<tr><td><a href="#FT_CFF_DRIVER_H">FT_CFF_DRIVER_H</a></td><td><a href="#FT_STROKER_H">FT_STROKER_H</a></td></tr>
-<tr><td><a href="#FT_TRUETYPE_DRIVER_H">FT_TRUETYPE_DRIVER_H</a></td><td><a href="#FT_SYNTHESIS_H">FT_SYNTHESIS_H</a></td></tr>
-<tr><td><a href="#FT_PCF_DRIVER_H">FT_PCF_DRIVER_H</a></td><td><a href="#FT_FONT_FORMATS_H">FT_FONT_FORMATS_H</a></td></tr>
-<tr><td><a href="#FT_TYPE1_TABLES_H">FT_TYPE1_TABLES_H</a></td><td><a href="#FT_TRIGONOMETRY_H">FT_TRIGONOMETRY_H</a></td></tr>
-<tr><td><a href="#FT_TRUETYPE_IDS_H">FT_TRUETYPE_IDS_H</a></td><td><a href="#FT_LCD_FILTER_H">FT_LCD_FILTER_H</a></td></tr>
-<tr><td><a href="#FT_TRUETYPE_TABLES_H">FT_TRUETYPE_TABLES_H</a></td><td><a href="#FT_UNPATENTED_HINTING_H">FT_UNPATENTED_HINTING_H</a></td></tr>
-<tr><td><a href="#FT_TRUETYPE_TAGS_H">FT_TRUETYPE_TAGS_H</a></td><td><a href="#FT_INCREMENTAL_H">FT_INCREMENTAL_H</a></td></tr>
-<tr><td><a href="#FT_BDF_H">FT_BDF_H</a></td><td><a href="#FT_GASP_H">FT_GASP_H</a></td></tr>
-<tr><td><a href="#FT_CID_H">FT_CID_H</a></td><td><a href="#FT_ADVANCES_H">FT_ADVANCES_H</a></td></tr>
-<tr><td><a href="#FT_GZIP_H">FT_GZIP_H</a></td><td><a href="#':'">':'</a></td></tr>
+<tr><td><a href="#FT_DRIVER_H">FT_DRIVER_H</a></td><td><a href="#FT_PFR_H">FT_PFR_H</a></td></tr>
+<tr><td><a href="#FT_AUTOHINTER_H">FT_AUTOHINTER_H</a></td><td><a href="#FT_STROKER_H">FT_STROKER_H</a></td></tr>
+<tr><td><a href="#FT_CFF_DRIVER_H">FT_CFF_DRIVER_H</a></td><td><a href="#FT_SYNTHESIS_H">FT_SYNTHESIS_H</a></td></tr>
+<tr><td><a href="#FT_TRUETYPE_DRIVER_H">FT_TRUETYPE_DRIVER_H</a></td><td><a href="#FT_FONT_FORMATS_H">FT_FONT_FORMATS_H</a></td></tr>
+<tr><td><a href="#FT_PCF_DRIVER_H">FT_PCF_DRIVER_H</a></td><td><a href="#FT_TRIGONOMETRY_H">FT_TRIGONOMETRY_H</a></td></tr>
+<tr><td><a href="#FT_TYPE1_TABLES_H">FT_TYPE1_TABLES_H</a></td><td><a href="#FT_LCD_FILTER_H">FT_LCD_FILTER_H</a></td></tr>
+<tr><td><a href="#FT_TRUETYPE_IDS_H">FT_TRUETYPE_IDS_H</a></td><td><a href="#FT_INCREMENTAL_H">FT_INCREMENTAL_H</a></td></tr>
+<tr><td><a href="#FT_TRUETYPE_TABLES_H">FT_TRUETYPE_TABLES_H</a></td><td><a href="#FT_GASP_H">FT_GASP_H</a></td></tr>
+<tr><td><a href="#FT_TRUETYPE_TAGS_H">FT_TRUETYPE_TAGS_H</a></td><td><a href="#FT_ADVANCES_H">FT_ADVANCES_H</a></td></tr>
 </table>
 
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 <div class="section">
+<h3 id="FT_DRIVER_H">FT_DRIVER_H</h3>
+<pre>
+#define <b>FT_DRIVER_H</b>  &lt;freetype/ftdriver.h&gt;
+</pre>
+
+<p>A macro used in #include statements to name the file containing structures and macros related to the driver modules.</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
 <h3 id="FT_AUTOHINTER_H">FT_AUTOHINTER_H</h3>
 <pre>
-#define <b>FT_AUTOHINTER_H</b>  &lt;freetype/ftautoh.h&gt;
+#define <b>FT_AUTOHINTER_H</b>  <a href="ft2-header_file_macros.html#FT_DRIVER_H">FT_DRIVER_H</a>
 </pre>
 
 <p>A macro used in #include statements to name the file containing structures and macros related to the auto-hinting module.</p>
+<p>Deprecated since version 2.9; use <a href="ft2-header_file_macros.html#FT_DRIVER_H">FT_DRIVER_H</a> instead.</p>
 
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 <div class="section">
 <h3 id="FT_CFF_DRIVER_H">FT_CFF_DRIVER_H</h3>
 <pre>
-#define <b>FT_CFF_DRIVER_H</b>  &lt;freetype/ftcffdrv.h&gt;
+#define <b>FT_CFF_DRIVER_H</b>  <a href="ft2-header_file_macros.html#FT_DRIVER_H">FT_DRIVER_H</a>
 </pre>
 
 <p>A macro used in #include statements to name the file containing structures and macros related to the CFF driver module.</p>
+<p>Deprecated since version 2.9; use <a href="ft2-header_file_macros.html#FT_DRIVER_H">FT_DRIVER_H</a> instead.</p>
 
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 <div class="section">
 <h3 id="FT_TRUETYPE_DRIVER_H">FT_TRUETYPE_DRIVER_H</h3>
 <pre>
-#define <b>FT_TRUETYPE_DRIVER_H</b>  &lt;freetype/ftttdrv.h&gt;
+#define <b>FT_TRUETYPE_DRIVER_H</b>  <a href="ft2-header_file_macros.html#FT_DRIVER_H">FT_DRIVER_H</a>
 </pre>
 
 <p>A macro used in #include statements to name the file containing structures and macros related to the TrueType driver module.</p>
+<p>Deprecated since version 2.9; use <a href="ft2-header_file_macros.html#FT_DRIVER_H">FT_DRIVER_H</a> instead.</p>
 
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 <div class="section">
 <h3 id="FT_PCF_DRIVER_H">FT_PCF_DRIVER_H</h3>
 <pre>
-#define <b>FT_PCF_DRIVER_H</b>  &lt;freetype/ftpcfdrv.h&gt;
+#define <b>FT_PCF_DRIVER_H</b>  <a href="ft2-header_file_macros.html#FT_DRIVER_H">FT_DRIVER_H</a>
 </pre>
 
 <p>A macro used in #include statements to name the file containing structures and macros related to the PCF driver module.</p>
+<p>Deprecated since version 2.9; use <a href="ft2-header_file_macros.html#FT_DRIVER_H">FT_DRIVER_H</a> instead.</p>
 
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 <div class="section">
-<h3 id="FT_CACHE_IMAGE_H">FT_CACHE_IMAGE_H</h3>
-<pre>
-#define <b>FT_CACHE_IMAGE_H</b>  <a href="ft2-header_file_macros.html#FT_CACHE_H">FT_CACHE_H</a>
-</pre>
-
-<p>A macro used in #include statements to name the file containing the &lsquo;glyph image&rsquo; API of the FreeType&nbsp;2 cache sub-system.</p>
-<p>It is used to define a cache for <a href="ft2-glyph_management.html#FT_Glyph">FT_Glyph</a> elements. You can also use the API defined in <a href="ft2-header_file_macros.html#FT_CACHE_SMALL_BITMAPS_H">FT_CACHE_SMALL_BITMAPS_H</a> if you only need to store small glyph bitmaps, as it will use less memory.</p>
-<p>This macro is deprecated. Simply include <a href="ft2-header_file_macros.html#FT_CACHE_H">FT_CACHE_H</a> to have all glyph image-related cache declarations.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="FT_CACHE_SMALL_BITMAPS_H">FT_CACHE_SMALL_BITMAPS_H</h3>
-<pre>
-#define <b>FT_CACHE_SMALL_BITMAPS_H</b>  <a href="ft2-header_file_macros.html#FT_CACHE_H">FT_CACHE_H</a>
-</pre>
-
-<p>A macro used in #include statements to name the file containing the &lsquo;small bitmaps&rsquo; API of the FreeType&nbsp;2 cache sub-system.</p>
-<p>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 <a href="ft2-header_file_macros.html#FT_CACHE_IMAGE_H">FT_CACHE_IMAGE_H</a> if you want to cache arbitrary glyph images, including scalable outlines.</p>
-<p>This macro is deprecated. Simply include <a href="ft2-header_file_macros.html#FT_CACHE_H">FT_CACHE_H</a> to have all small bitmaps-related cache declarations.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="FT_CACHE_CHARMAP_H">FT_CACHE_CHARMAP_H</h3>
-<pre>
-#define <b>FT_CACHE_CHARMAP_H</b>  <a href="ft2-header_file_macros.html#FT_CACHE_H">FT_CACHE_H</a>
-</pre>
-
-<p>A macro used in #include statements to name the file containing the &lsquo;charmap&rsquo; API of the FreeType&nbsp;2 cache sub-system.</p>
-<p>This macro is deprecated. Simply include <a href="ft2-header_file_macros.html#FT_CACHE_H">FT_CACHE_H</a> to have all charmap-based cache declarations.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
 <h3 id="FT_MAC_H">FT_MAC_H</h3>
 <pre>
 #define <b>FT_MAC_H</b>  &lt;freetype/ftmac.h&gt;
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 <div class="section">
-<h3 id="FT_UNPATENTED_HINTING_H">FT_UNPATENTED_HINTING_H</h3>
-<pre>
-#define <b>FT_UNPATENTED_HINTING_H</b>  &lt;freetype/ttunpat.h&gt;
-</pre>
-
-<p>Deprecated.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
 <h3 id="FT_INCREMENTAL_H">FT_INCREMENTAL_H</h3>
 <pre>
 #define <b>FT_INCREMENTAL_H</b>  &lt;freetype/ftincrem.h&gt;
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
-<div class="section">
-<h3 id="':'">':'</h3>
-<p>Defined in FT_CONFIG_OPTIONS_H (freetype/config/ftoption.h).</p>
-<pre>
-#define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
-</pre>
-<h4>property-name1</h4>
-<p>'=' &lt;property-value1&gt;</p>
-
-<h4>module-name2</h4>
-<p>':'</p>
-
-<h4>property-name2</h4>
-<p>'=' &lt;property-value2&gt; ...</p>
-<p>Example:</p>
-<p>FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ cff:no-stem-darkening=1 \ autofitter:warping=1</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
 </body>
 </html>
index 54abb7d..9f4182d 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="header_inclusion">FreeType's header inclusion scheme</h1>
 
index 0ca7b51..c20a475 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="incremental">Incremental Loading</h1>
 <h2>Synopsis</h2>
 <tr><td><a href="#FT_Incremental_MetricsRec">FT_Incremental_MetricsRec</a></td><td><a href="#FT_Incremental_FuncsRec">FT_Incremental_FuncsRec</a></td></tr>
 <tr><td><a href="#FT_Incremental_Metrics">FT_Incremental_Metrics</a></td><td><a href="#FT_Incremental_InterfaceRec">FT_Incremental_InterfaceRec</a></td></tr>
 <tr><td><a href="#FT_Incremental_GetGlyphDataFunc">FT_Incremental_GetGlyphDataFunc</a></td><td><a href="#FT_Incremental_Interface">FT_Incremental_Interface</a></td></tr>
-<tr><td><a href="#FT_Incremental_FreeGlyphDataFunc">FT_Incremental_FreeGlyphDataFunc</a></td><td><a href="#FT_PARAM_TAG_INCREMENTAL">FT_PARAM_TAG_INCREMENTAL</a></td></tr>
+<tr><td><a href="#FT_Incremental_FreeGlyphDataFunc">FT_Incremental_FreeGlyphDataFunc</a></td><td></td></tr>
 </table>
 
 
 <p>This section contains various functions used to perform so-called &lsquo;incremental&rsquo; glyph loading. This is a mode where all glyphs loaded from a given <a href="ft2-base_interface.html#FT_Face">FT_Face</a> are provided by the client application.</p>
 <p>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.</p>
-<p>To enable this mode, you must use <a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a>, passing an <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> with the <a href="ft2-incremental.html#FT_PARAM_TAG_INCREMENTAL">FT_PARAM_TAG_INCREMENTAL</a> tag and an <a href="ft2-incremental.html#FT_Incremental_Interface">FT_Incremental_Interface</a> value. See the comments for <a href="ft2-incremental.html#FT_Incremental_InterfaceRec">FT_Incremental_InterfaceRec</a> for an example.</p>
+<p>To enable this mode, you must use <a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a>, passing an <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> with the <a href="ft2-parameter_tags.html#FT_PARAM_TAG_INCREMENTAL">FT_PARAM_TAG_INCREMENTAL</a> tag and an <a href="ft2-incremental.html#FT_Incremental_Interface">FT_Incremental_Interface</a> value. See the comments for <a href="ft2-incremental.html#FT_Incremental_InterfaceRec">FT_Incremental_InterfaceRec</a> for an example.</p>
 
 <div class="section">
 <h3 id="FT_Incremental">FT_Incremental</h3>
   } <b>FT_Incremental_InterfaceRec</b>;
 </pre>
 
-<p>A structure to be used with <a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a> to indicate that the user wants to support incremental glyph loading. You should use it with <a href="ft2-incremental.html#FT_PARAM_TAG_INCREMENTAL">FT_PARAM_TAG_INCREMENTAL</a> as in the following example:</p>
+<p>A structure to be used with <a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a> to indicate that the user wants to support incremental glyph loading. You should use it with <a href="ft2-parameter_tags.html#FT_PARAM_TAG_INCREMENTAL">FT_PARAM_TAG_INCREMENTAL</a> as in the following example:</p>
 <pre class="colored">
   FT_Incremental_InterfaceRec  inc_int;
   FT_Parameter                 parameter;
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
-<div class="section">
-<h3 id="FT_PARAM_TAG_INCREMENTAL">FT_PARAM_TAG_INCREMENTAL</h3>
-<p>Defined in FT_INCREMENTAL_H (freetype/ftincrem.h).</p>
-<pre>
-#define <b>FT_PARAM_TAG_INCREMENTAL</b>  <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 'i', 'n', 'c', 'r' )
-</pre>
-
-<p>A constant used as the tag of <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> structures to indicate an incremental loading object to be used by FreeType.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
 </body>
 </html>
index edf6904..62a2546 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <table class="index">
-<tr><td><a href="ft2-header_file_macros.html#':'">':'</a></td><td><a href="ft2-base_interface.html#FT_Kerning_Mode">FT_KERNING_UNFITTED</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_EndSubPath">FT_Stroker_EndSubPath</a></td></tr>
-<tr><td><a href="ft2-bdf_fonts.html#BDF_PropertyType">BDF_PROPERTY_TYPE_ATOM</a></td><td><a href="ft2-base_interface.html#FT_Kerning_Mode">FT_KERNING_UNSCALED</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_Export">FT_Stroker_Export</a></td></tr>
-<tr><td><a href="ft2-bdf_fonts.html#BDF_PropertyType">BDF_PROPERTY_TYPE_CARDINAL</a></td><td><a href="ft2-base_interface.html#FT_Kerning_Mode">FT_Kerning_Mode</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_ExportBorder">FT_Stroker_ExportBorder</a></td></tr>
-<tr><td><a href="ft2-bdf_fonts.html#BDF_PropertyType">BDF_PROPERTY_TYPE_INTEGER</a></td><td><a href="ft2-lcd_filtering.html#FT_LcdFilter">FT_LCD_FILTER_DEFAULT</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_GetBorderCounts">FT_Stroker_GetBorderCounts</a></td></tr>
-<tr><td><a href="ft2-bdf_fonts.html#BDF_PropertyType">BDF_PROPERTY_TYPE_NONE</a></td><td><a href="ft2-header_file_macros.html#FT_LCD_FILTER_H">FT_LCD_FILTER_H</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_GetCounts">FT_Stroker_GetCounts</a></td></tr>
-<tr><td><a href="ft2-bdf_fonts.html#BDF_Property">BDF_Property</a></td><td><a href="ft2-lcd_filtering.html#FT_LcdFilter">FT_LCD_FILTER_LEGACY</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineCap">FT_Stroker_LineCap</a></td></tr>
-<tr><td><a href="ft2-bdf_fonts.html#BDF_PropertyRec">BDF_PropertyRec</a></td><td><a href="ft2-lcd_filtering.html#FT_LcdFilter">FT_LCD_FILTER_LEGACY1</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineJoin">FT_Stroker_LineJoin</a></td></tr>
-<tr><td><a href="ft2-bdf_fonts.html#BDF_PropertyType">BDF_PropertyType</a></td><td><a href="ft2-lcd_filtering.html#FT_LcdFilter">FT_LCD_FILTER_LIGHT</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineTo">FT_Stroker_LineTo</a></td></tr>
-<tr><td><a href="ft2-type1_tables.html#CID_FaceDict">CID_FaceDict</a></td><td><a href="ft2-lcd_filtering.html#FT_LcdFilter">FT_LCD_FILTER_NONE</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_New">FT_Stroker_New</a></td></tr>
-<tr><td><a href="ft2-type1_tables.html#CID_FaceDictRec">CID_FaceDictRec</a></td><td><a href="ft2-lcd_filtering.html#FT_LcdFilter">FT_LcdFilter</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_ParseOutline">FT_Stroker_ParseOutline</a></td></tr>
-<tr><td><a href="ft2-type1_tables.html#CID_FaceInfo">CID_FaceInfo</a></td><td><a href="ft2-header_file_macros.html#FT_LIST_H">FT_LIST_H</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_Rewind">FT_Stroker_Rewind</a></td></tr>
-<tr><td><a href="ft2-type1_tables.html#CID_FaceInfoRec">CID_FaceInfoRec</a></td><td><a href="ft2-base_interface.html#FT_Library">FT_Library</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_Set">FT_Stroker_Set</a></td></tr>
-<tr><td><a href="ft2-type1_tables.html#CID_FontDict">CID_FontDict</a></td><td><a href="ft2-lcd_filtering.html#FT_Library_SetLcdFilter">FT_Library_SetLcdFilter</a></td><td><a href="ft2-glyph_stroker.html#FT_StrokerBorder">FT_StrokerBorder</a></td></tr>
-<tr><td><a href="ft2-type1_tables.html#CID_Info">CID_Info</a></td><td><a href="ft2-lcd_filtering.html#FT_Library_SetLcdFilterWeights">FT_Library_SetLcdFilterWeights</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_2X2</a></td></tr>
-<tr><td><a href="ft2-auto_hinter.html#darkening-parameters(autofit)">darkening-parameters (autofit)</a></td><td><a href="ft2-version.html#FT_Library_Version">FT_Library_Version</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS</a></td></tr>
-<tr><td><a href="ft2-cff_driver.html#darkening-parameters(cff)">darkening-parameters (cff)</a></td><td><a href="ft2-list_processing.html#FT_List">FT_List</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES</a></td></tr>
-<tr><td><a href="ft2-auto_hinter.html#default-script">default-script</a></td><td><a href="ft2-list_processing.html#FT_List_Add">FT_List_Add</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID</a></td></tr>
-<tr><td><a href="ft2-version.html#FREETYPE_XXX">FREETYPE_MAJOR</a></td><td><a href="ft2-list_processing.html#FT_List_Destructor">FT_List_Destructor</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_SCALE</a></td></tr>
-<tr><td><a href="ft2-version.html#FREETYPE_XXX">FREETYPE_MINOR</a></td><td><a href="ft2-list_processing.html#FT_List_Finalize">FT_List_Finalize</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_USE_MY_METRICS</a></td></tr>
-<tr><td><a href="ft2-version.html#FREETYPE_XXX">FREETYPE_PATCH</a></td><td><a href="ft2-list_processing.html#FT_List_Find">FT_List_Find</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_XXX</a></td></tr>
-<tr><td><a href="ft2-version.html#FREETYPE_XXX">FREETYPE_XXX</a></td><td><a href="ft2-list_processing.html#FT_List_Insert">FT_List_Insert</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_XY_SCALE</a></td></tr>
-<tr><td><a href="ft2-sizes_management.html#FT_Activate_Size">FT_Activate_Size</a></td><td><a href="ft2-list_processing.html#FT_List_Iterate">FT_List_Iterate</a></td><td><a href="ft2-base_interface.html#FT_SubGlyph">FT_SubGlyph</a></td></tr>
-<tr><td><a href="ft2-quick_advance.html#FT_ADVANCE_FLAG_FAST_ONLY">FT_ADVANCE_FLAG_FAST_ONLY</a></td><td><a href="ft2-list_processing.html#FT_List_Iterator">FT_List_Iterator</a></td><td><a href="ft2-header_file_macros.html#FT_SYNTHESIS_H">FT_SYNTHESIS_H</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_ADVANCES_H">FT_ADVANCES_H</a></td><td><a href="ft2-list_processing.html#FT_List_Remove">FT_List_Remove</a></td><td><a href="ft2-header_file_macros.html#FT_SYSTEM_H">FT_SYSTEM_H</a></td></tr>
-<tr><td><a href="ft2-module_management.html#FT_Add_Default_Modules">FT_Add_Default_Modules</a></td><td><a href="ft2-list_processing.html#FT_List_Up">FT_List_Up</a></td><td><a href="ft2-basic_types.html#FT_Tag">FT_Tag</a></td></tr>
-<tr><td><a href="ft2-module_management.html#FT_Add_Module">FT_Add_Module</a></td><td><a href="ft2-list_processing.html#FT_ListNode">FT_ListNode</a></td><td><a href="ft2-computations.html#FT_Tan">FT_Tan</a></td></tr>
-<tr><td><a href="ft2-system_interface.html#FT_Alloc_Func">FT_Alloc_Func</a></td><td><a href="ft2-list_processing.html#FT_ListNodeRec">FT_ListNodeRec</a></td><td><a href="ft2-header_file_macros.html#FT_TRIGONOMETRY_H">FT_TRIGONOMETRY_H</a></td></tr>
-<tr><td><a href="ft2-computations.html#FT_ANGLE_2PI">FT_ANGLE_2PI</a></td><td><a href="ft2-list_processing.html#FT_ListRec">FT_ListRec</a></td><td><a href="ft2-header_file_macros.html#FT_TRUETYPE_DRIVER_H">FT_TRUETYPE_DRIVER_H</a></td></tr>
-<tr><td><a href="ft2-computations.html#FT_ANGLE_PI">FT_ANGLE_PI</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_BITMAP_METRICS_ONLY</a></td><td><a href="ft2-truetype_engine.html#FT_TrueTypeEngineType">FT_TRUETYPE_ENGINE_TYPE_NONE</a></td></tr>
-<tr><td><a href="ft2-computations.html#FT_ANGLE_PI2">FT_ANGLE_PI2</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_COLOR</a></td><td><a href="ft2-truetype_engine.html#FT_TrueTypeEngineType">FT_TRUETYPE_ENGINE_TYPE_PATENTED</a></td></tr>
-<tr><td><a href="ft2-computations.html#FT_ANGLE_PI4">FT_ANGLE_PI4</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_COMPUTE_METRICS</a></td><td><a href="ft2-truetype_engine.html#FT_TrueTypeEngineType">FT_TRUETYPE_ENGINE_TYPE_UNPATENTED</a></td></tr>
-<tr><td><a href="ft2-computations.html#FT_Angle">FT_Angle</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_CROP_BITMAP</a></td><td><a href="ft2-header_file_macros.html#FT_TRUETYPE_IDS_H">FT_TRUETYPE_IDS_H</a></td></tr>
-<tr><td><a href="ft2-computations.html#FT_Angle_Diff">FT_Angle_Diff</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_DEFAULT</a></td><td><a href="ft2-header_file_macros.html#FT_TRUETYPE_TABLES_H">FT_TRUETYPE_TABLES_H</a></td></tr>
-<tr><td><a href="ft2-computations.html#FT_Atan2">FT_Atan2</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_FORCE_AUTOHINT</a></td><td><a href="ft2-header_file_macros.html#FT_TRUETYPE_TAGS_H">FT_TRUETYPE_TAGS_H</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Attach_File">FT_Attach_File</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH</a></td><td><a href="ft2-truetype_engine.html#FT_TrueTypeEngineType">FT_TrueTypeEngineType</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Attach_Stream">FT_Attach_Stream</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_IGNORE_TRANSFORM</a></td><td><a href="ft2-gx_validation.html#FT_TrueTypeGX_Free">FT_TrueTypeGX_Free</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_AUTOHINTER_H">FT_AUTOHINTER_H</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_LINEAR_DESIGN</a></td><td><a href="ft2-gx_validation.html#FT_TrueTypeGX_Validate">FT_TrueTypeGX_Validate</a></td></tr>
-<tr><td><a href="ft2-auto_hinter.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_CJK</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_MONOCHROME</a></td><td><a href="ft2-header_file_macros.html#FT_TYPE1_TABLES_H">FT_TYPE1_TABLES_H</a></td></tr>
-<tr><td><a href="ft2-auto_hinter.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_INDIC</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_NO_AUTOHINT</a></td><td><a href="ft2-header_file_macros.html#FT_TYPES_H">FT_TYPES_H</a></td></tr>
-<tr><td><a href="ft2-auto_hinter.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_LATIN</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_NO_BITMAP</a></td><td><a href="ft2-basic_types.html#FT_UFWord">FT_UFWord</a></td></tr>
-<tr><td><a href="ft2-auto_hinter.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_NONE</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_NO_HINTING</a></td><td><a href="ft2-basic_types.html#FT_UInt">FT_UInt</a></td></tr>
-<tr><td><a href="ft2-auto_hinter.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_XXX</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_NO_RECURSE</a></td><td><a href="ft2-basic_types.html#FT_UInt16">FT_UInt16</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_BBOX_H">FT_BBOX_H</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_NO_SCALE</a></td><td><a href="ft2-basic_types.html#FT_UInt32">FT_UInt32</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_BBox">FT_BBox</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_PEDANTIC</a></td><td><a href="ft2-basic_types.html#FT_UInt64">FT_UInt64</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_BDF_H">FT_BDF_H</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_RENDER</a></td><td><a href="ft2-basic_types.html#FT_ULong">FT_ULong</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_BITMAP_H">FT_BITMAP_H</a></td><td><a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_LCD</a></td><td><a href="ft2-header_file_macros.html#FT_UNPATENTED_HINTING_H">FT_UNPATENTED_HINTING_H</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Bitmap">FT_Bitmap</a></td><td><a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_LCD_V</a></td><td><a href="ft2-basic_types.html#FT_UnitVector">FT_UnitVector</a></td></tr>
-<tr><td><a href="ft2-bitmap_handling.html#FT_Bitmap_Convert">FT_Bitmap_Convert</a></td><td><a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_LIGHT</a></td><td><a href="ft2-basic_types.html#FT_UShort">FT_UShort</a></td></tr>
-<tr><td><a href="ft2-bitmap_handling.html#FT_Bitmap_Copy">FT_Bitmap_Copy</a></td><td><a href="ft2-base_interface.html#FT_LOAD_TARGET_MODE">FT_LOAD_TARGET_MODE</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_CKERNXXX">FT_VALIDATE_APPLE</a></td></tr>
-<tr><td><a href="ft2-bitmap_handling.html#FT_Bitmap_Done">FT_Bitmap_Done</a></td><td><a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_MONO</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_BASE</a></td></tr>
-<tr><td><a href="ft2-bitmap_handling.html#FT_Bitmap_Embolden">FT_Bitmap_Embolden</a></td><td><a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_NORMAL</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_bsln</a></td></tr>
-<tr><td><a href="ft2-bitmap_handling.html#FT_Bitmap_Init">FT_Bitmap_Init</a></td><td><a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_XXX</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_CKERNXXX">FT_VALIDATE_CKERN</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Bitmap_Size">FT_Bitmap_Size</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_VERTICAL_LAYOUT</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_CKERNXXX">FT_VALIDATE_CKERNXXX</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_BitmapGlyph">FT_BitmapGlyph</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_XXX</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_feat</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_BitmapGlyphRec">FT_BitmapGlyphRec</a></td><td><a href="ft2-base_interface.html#FT_Load_Char">FT_Load_Char</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_GDEF</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Bool">FT_Bool</a></td><td><a href="ft2-base_interface.html#FT_Load_Glyph">FT_Load_Glyph</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_GPOS</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Byte">FT_Byte</a></td><td><a href="ft2-truetype_tables.html#FT_Load_Sfnt_Table">FT_Load_Sfnt_Table</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_GSUB</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Bytes">FT_Bytes</a></td><td><a href="ft2-basic_types.html#FT_Long">FT_Long</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_GX</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_BZIP2_H">FT_BZIP2_H</a></td><td><a href="ft2-header_file_macros.html#FT_LZW_H">FT_LZW_H</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GX_LENGTH">FT_VALIDATE_GX_LENGTH</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_CACHE_CHARMAP_H">FT_CACHE_CHARMAP_H</a></td><td><a href="ft2-header_file_macros.html#FT_MAC_H">FT_MAC_H</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_GXXXX</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_CACHE_H">FT_CACHE_H</a></td><td><a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_JSTF</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_CACHE_IMAGE_H">FT_CACHE_IMAGE_H</a></td><td><a href="ft2-basic_types.html#FT_Matrix">FT_Matrix</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_just</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_CACHE_SMALL_BITMAPS_H">FT_CACHE_SMALL_BITMAPS_H</a></td><td><a href="ft2-computations.html#FT_Matrix_Invert">FT_Matrix_Invert</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_kern</a></td></tr>
-<tr><td><a href="ft2-computations.html#FT_CeilFix">FT_CeilFix</a></td><td><a href="ft2-computations.html#FT_Matrix_Multiply">FT_Matrix_Multiply</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_lcar</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_CFF_DRIVER_H">FT_CFF_DRIVER_H</a></td><td><a href="ft2-system_interface.html#FT_Memory">FT_Memory</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_MATH</a></td></tr>
-<tr><td><a href="ft2-cff_driver.html#FT_CFF_HINTING_XXX">FT_CFF_HINTING_ADOBE</a></td><td><a href="ft2-system_interface.html#FT_MemoryRec">FT_MemoryRec</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_CKERNXXX">FT_VALIDATE_MS</a></td></tr>
-<tr><td><a href="ft2-cff_driver.html#FT_CFF_HINTING_XXX">FT_CFF_HINTING_FREETYPE</a></td><td><a href="ft2-multiple_masters.html#FT_MM_Axis">FT_MM_Axis</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_mort</a></td></tr>
-<tr><td><a href="ft2-cff_driver.html#FT_CFF_HINTING_XXX">FT_CFF_HINTING_XXX</a></td><td><a href="ft2-multiple_masters.html#FT_MM_Var">FT_MM_Var</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_morx</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Char">FT_Char</a></td><td><a href="ft2-header_file_macros.html#FT_MODULE_ERRORS_H">FT_MODULE_ERRORS_H</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_OT</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_CharMap">FT_CharMap</a></td><td><a href="ft2-header_file_macros.html#FT_MODULE_H">FT_MODULE_H</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_OTXXX</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_CharMapRec">FT_CharMapRec</a></td><td><a href="ft2-module_management.html#FT_Module">FT_Module</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_opbd</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_CID_H">FT_CID_H</a></td><td><a href="ft2-module_management.html#FT_Module_Class">FT_Module_Class</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_prop</a></td></tr>
-<tr><td><a href="ft2-gx_validation.html#FT_ClassicKern_Free">FT_ClassicKern_Free</a></td><td><a href="ft2-module_management.html#FT_Module_Constructor">FT_Module_Constructor</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_trak</a></td></tr>
-<tr><td><a href="ft2-gx_validation.html#FT_ClassicKern_Validate">FT_ClassicKern_Validate</a></td><td><a href="ft2-module_management.html#FT_Module_Destructor">FT_Module_Destructor</a></td><td><a href="ft2-multiple_masters.html#FT_Var_Axis">FT_Var_Axis</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_CONFIG_CONFIG_H">FT_CONFIG_CONFIG_H</a></td><td><a href="ft2-module_management.html#FT_Module_Requester">FT_Module_Requester</a></td><td><a href="ft2-multiple_masters.html#FT_Var_Named_Style">FT_Var_Named_Style</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_CONFIG_MODULES_H">FT_CONFIG_MODULES_H</a></td><td><a href="ft2-header_file_macros.html#FT_MULTIPLE_MASTERS_H">FT_MULTIPLE_MASTERS_H</a></td><td><a href="ft2-basic_types.html#FT_Vector">FT_Vector</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_CONFIG_OPTIONS_H">FT_CONFIG_OPTIONS_H</a></td><td><a href="ft2-computations.html#FT_MulDiv">FT_MulDiv</a></td><td><a href="ft2-computations.html#FT_Vector_From_Polar">FT_Vector_From_Polar</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_CONFIG_STANDARD_LIBRARY_H">FT_CONFIG_STANDARD_LIBRARY_H</a></td><td><a href="ft2-computations.html#FT_MulFix">FT_MulFix</a></td><td><a href="ft2-computations.html#FT_Vector_Length">FT_Vector_Length</a></td></tr>
-<tr><td><a href="ft2-computations.html#FT_Cos">FT_Cos</a></td><td><a href="ft2-multiple_masters.html#FT_Multi_Master">FT_Multi_Master</a></td><td><a href="ft2-computations.html#FT_Vector_Polarize">FT_Vector_Polarize</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Data">FT_Data</a></td><td><a href="ft2-base_interface.html#FT_New_Face">FT_New_Face</a></td><td><a href="ft2-computations.html#FT_Vector_Rotate">FT_Vector_Rotate</a></td></tr>
-<tr><td><a href="ft2-computations.html#FT_DivFix">FT_DivFix</a></td><td><a href="ft2-mac_specific.html#FT_New_Face_From_FOND">FT_New_Face_From_FOND</a></td><td><a href="ft2-computations.html#FT_Vector_Transform">FT_Vector_Transform</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Done_Face">FT_Done_Face</a></td><td><a href="ft2-mac_specific.html#FT_New_Face_From_FSRef">FT_New_Face_From_FSRef</a></td><td><a href="ft2-computations.html#FT_Vector_Unit">FT_Vector_Unit</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Done_FreeType">FT_Done_FreeType</a></td><td><a href="ft2-mac_specific.html#FT_New_Face_From_FSSpec">FT_New_Face_From_FSSpec</a></td><td><a href="ft2-header_file_macros.html#FT_WINFONTS_H">FT_WINFONTS_H</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_Done_Glyph">FT_Done_Glyph</a></td><td><a href="ft2-module_management.html#FT_New_Library">FT_New_Library</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_Header">FT_WinFNT_Header</a></td></tr>
-<tr><td><a href="ft2-module_management.html#FT_Done_Library">FT_Done_Library</a></td><td><a href="ft2-base_interface.html#FT_New_Memory_Face">FT_New_Memory_Face</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_HeaderRec">FT_WinFNT_HeaderRec</a></td></tr>
-<tr><td><a href="ft2-sizes_management.html#FT_Done_Size">FT_Done_Size</a></td><td><a href="ft2-sizes_management.html#FT_New_Size">FT_New_Size</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1250</a></td></tr>
-<tr><td><a href="ft2-module_management.html#FT_Driver">FT_Driver</a></td><td><a href="ft2-basic_types.html#FT_Offset">FT_Offset</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1251</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_ENC_TAG">FT_ENC_TAG</a></td><td><a href="ft2-base_interface.html#FT_OPEN_XXX">FT_OPEN_DRIVER</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1252</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_ADOBE_CUSTOM</a></td><td><a href="ft2-base_interface.html#FT_OPEN_XXX">FT_OPEN_MEMORY</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1253</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_ADOBE_EXPERT</a></td><td><a href="ft2-base_interface.html#FT_OPEN_XXX">FT_OPEN_PARAMS</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1254</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_ADOBE_LATIN_1</a></td><td><a href="ft2-base_interface.html#FT_OPEN_XXX">FT_OPEN_PATHNAME</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1255</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_ADOBE_STANDARD</a></td><td><a href="ft2-base_interface.html#FT_OPEN_XXX">FT_OPEN_STREAM</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1256</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_APPLE_ROMAN</a></td><td><a href="ft2-base_interface.html#FT_OPEN_XXX">FT_OPEN_XXX</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1257</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_BIG5</a></td><td><a href="ft2-header_file_macros.html#FT_OPENTYPE_VALIDATE_H">FT_OPENTYPE_VALIDATE_H</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1258</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_JOHAB</a></td><td><a href="ft2-base_interface.html#FT_Open_Args">FT_Open_Args</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1361</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_MS_BIG5</a></td><td><a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP874</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_MS_GB2312</a></td><td><a href="ft2-ot_validation.html#FT_OpenType_Free">FT_OpenType_Free</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP932</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_MS_JOHAB</a></td><td><a href="ft2-ot_validation.html#FT_OpenType_Validate">FT_OpenType_Validate</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP936</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_MS_SJIS</a></td><td><a href="ft2-outline_processing.html#FT_Orientation">FT_ORIENTATION_FILL_LEFT</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP949</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_MS_SYMBOL</a></td><td><a href="ft2-outline_processing.html#FT_Orientation">FT_ORIENTATION_FILL_RIGHT</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP950</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_MS_WANSUNG</a></td><td><a href="ft2-outline_processing.html#FT_Orientation">FT_ORIENTATION_NONE</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_DEFAULT</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_NONE</a></td><td><a href="ft2-outline_processing.html#FT_Orientation">FT_ORIENTATION_POSTSCRIPT</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_MAC</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_OLD_LATIN_2</a></td><td><a href="ft2-outline_processing.html#FT_Orientation">FT_ORIENTATION_TRUETYPE</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_OEM</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_PRC</a></td><td><a href="ft2-outline_processing.html#FT_Orientation">FT_Orientation</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_SYMBOL</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_SJIS</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_EVEN_ODD_FILL</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_XXX</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_UNICODE</a></td><td><a href="ft2-header_file_macros.html#FT_OUTLINE_H">FT_OUTLINE_H</a></td><td><a href="ft2-cache_subsystem.html#FTC_CMapCache">FTC_CMapCache</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_WANSUNG</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_HIGH_PRECISION</a></td><td><a href="ft2-cache_subsystem.html#FTC_CMapCache_Lookup">FTC_CMapCache_Lookup</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_Encoding</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_IGNORE_DROPOUTS</a></td><td><a href="ft2-cache_subsystem.html#FTC_CMapCache_New">FTC_CMapCache_New</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_ERRORS_H">FT_ERRORS_H</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_INCLUDE_STUBS</a></td><td><a href="ft2-cache_subsystem.html#FTC_Face_Requester">FTC_Face_Requester</a></td></tr>
-<tr><td><a href="ft2-error_code_values.html#FT_Err_XXX">FT_Err_XXX</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_NONE</a></td><td><a href="ft2-cache_subsystem.html#FTC_FaceID">FTC_FaceID</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Error">FT_Error</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_OWNER</a></td><td><a href="ft2-cache_subsystem.html#FTC_ImageCache">FTC_ImageCache</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_F26Dot6">FT_F26Dot6</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_REVERSE_FILL</a></td><td><a href="ft2-cache_subsystem.html#FTC_ImageCache_Lookup">FTC_ImageCache_Lookup</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_F2Dot14">FT_F2Dot14</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_SINGLE_PASS</a></td><td><a href="ft2-cache_subsystem.html#FTC_ImageCache_LookupScaler">FTC_ImageCache_LookupScaler</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_CID_KEYED</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_SMART_DROPOUTS</a></td><td><a href="ft2-cache_subsystem.html#FTC_ImageCache_New">FTC_ImageCache_New</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_COLOR</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_XXX</a></td><td><a href="ft2-cache_subsystem.html#FTC_ImageType">FTC_ImageType</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_EXTERNAL_STREAM</a></td><td><a href="ft2-outline_processing.html#FT_Outline">FT_Outline</a></td><td><a href="ft2-cache_subsystem.html#FTC_ImageTypeRec">FTC_ImageTypeRec</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_FAST_GLYPHS</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Check">FT_Outline_Check</a></td><td><a href="ft2-cache_subsystem.html#FTC_Manager">FTC_Manager</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_FIXED_SIZES</a></td><td><a href="ft2-outline_processing.html#FT_Outline_ConicToFunc">FT_Outline_ConicToFunc</a></td><td><a href="ft2-cache_subsystem.html#FTC_Manager_Done">FTC_Manager_Done</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_FIXED_WIDTH</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Copy">FT_Outline_Copy</a></td><td><a href="ft2-cache_subsystem.html#FTC_Manager_LookupFace">FTC_Manager_LookupFace</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_GLYPH_NAMES</a></td><td><a href="ft2-outline_processing.html#FT_Outline_CubicToFunc">FT_Outline_CubicToFunc</a></td><td><a href="ft2-cache_subsystem.html#FTC_Manager_LookupSize">FTC_Manager_LookupSize</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_HINTER</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Decompose">FT_Outline_Decompose</a></td><td><a href="ft2-cache_subsystem.html#FTC_Manager_New">FTC_Manager_New</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_HORIZONTAL</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Done">FT_Outline_Done</a></td><td><a href="ft2-cache_subsystem.html#FTC_Manager_RemoveFaceID">FTC_Manager_RemoveFaceID</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_KERNING</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Embolden">FT_Outline_Embolden</a></td><td><a href="ft2-cache_subsystem.html#FTC_Manager_Reset">FTC_Manager_Reset</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_MULTIPLE_MASTERS</a></td><td><a href="ft2-outline_processing.html#FT_Outline_EmboldenXY">FT_Outline_EmboldenXY</a></td><td><a href="ft2-cache_subsystem.html#FTC_Node">FTC_Node</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_SCALABLE</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Funcs">FT_Outline_Funcs</a></td><td><a href="ft2-cache_subsystem.html#FTC_Node_Unref">FTC_Node_Unref</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_SFNT</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Get_BBox">FT_Outline_Get_BBox</a></td><td><a href="ft2-cache_subsystem.html#FTC_SBit">FTC_SBit</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_TRICKY</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Get_Bitmap">FT_Outline_Get_Bitmap</a></td><td><a href="ft2-cache_subsystem.html#FTC_SBitCache">FTC_SBitCache</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_VERTICAL</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Get_CBox">FT_Outline_Get_CBox</a></td><td><a href="ft2-cache_subsystem.html#FTC_SBitCache_Lookup">FTC_SBitCache_Lookup</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_XXX</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Get_Orientation">FT_Outline_Get_Orientation</a></td><td><a href="ft2-cache_subsystem.html#FTC_SBitCache_LookupScaler">FTC_SBitCache_LookupScaler</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Face">FT_Face</a></td><td><a href="ft2-glyph_stroker.html#FT_Outline_GetInsideBorder">FT_Outline_GetInsideBorder</a></td><td><a href="ft2-cache_subsystem.html#FTC_SBitCache_New">FTC_SBitCache_New</a></td></tr>
-<tr><td><a href="ft2-version.html#FT_Face_CheckTrueTypePatents">FT_Face_CheckTrueTypePatents</a></td><td><a href="ft2-glyph_stroker.html#FT_Outline_GetOutsideBorder">FT_Outline_GetOutsideBorder</a></td><td><a href="ft2-cache_subsystem.html#FTC_SBitRec">FTC_SBitRec</a></td></tr>
-<tr><td><a href="ft2-glyph_variants.html#FT_Face_GetCharsOfVariant">FT_Face_GetCharsOfVariant</a></td><td><a href="ft2-outline_processing.html#FT_Outline_LineToFunc">FT_Outline_LineToFunc</a></td><td><a href="ft2-cache_subsystem.html#FTC_Scaler">FTC_Scaler</a></td></tr>
-<tr><td><a href="ft2-glyph_variants.html#FT_Face_GetCharVariantIndex">FT_Face_GetCharVariantIndex</a></td><td><a href="ft2-outline_processing.html#FT_Outline_MoveToFunc">FT_Outline_MoveToFunc</a></td><td><a href="ft2-cache_subsystem.html#FTC_ScalerRec">FTC_ScalerRec</a></td></tr>
-<tr><td><a href="ft2-glyph_variants.html#FT_Face_GetCharVariantIsDefault">FT_Face_GetCharVariantIsDefault</a></td><td><a href="ft2-outline_processing.html#FT_Outline_New">FT_Outline_New</a></td><td><a href="ft2-auto_hinter.html#fallback-script">fallback-script</a></td></tr>
-<tr><td><a href="ft2-glyph_variants.html#FT_Face_GetVariantSelectors">FT_Face_GetVariantSelectors</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Render">FT_Outline_Render</a></td><td><a href="ft2-auto_hinter.html#glyph-to-script-map">glyph-to-script-map</a></td></tr>
-<tr><td><a href="ft2-glyph_variants.html#FT_Face_GetVariantsOfChar">FT_Face_GetVariantsOfChar</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Reverse">FT_Outline_Reverse</a></td><td><a href="ft2-cff_driver.html#hinting-engine(cff)">hinting-engine (cff)</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Face_Internal">FT_Face_Internal</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Transform">FT_Outline_Transform</a></td><td><a href="ft2-auto_hinter.html#increase-x-height">increase-x-height</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Translate">FT_Outline_Translate</a></td><td><a href="ft2-tt_driver.html#interpreter-version">interpreter-version</a></td></tr>
-<tr><td><a href="ft2-version.html#FT_Face_SetUnpatentedHinting">FT_Face_SetUnpatentedHinting</a></td><td><a href="ft2-glyph_management.html#FT_OutlineGlyph">FT_OutlineGlyph</a></td><td><a href="ft2-pcf_driver.html#no-long-family-names">no-long-family-names</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FaceRec">FT_FaceRec</a></td><td><a href="ft2-glyph_management.html#FT_OutlineGlyphRec">FT_OutlineGlyphRec</a></td><td><a href="ft2-auto_hinter.html#no-stem-darkening(autofit)">no-stem-darkening (autofit)</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Fixed">FT_Fixed</a></td><td><a href="ft2-sfnt_names.html#FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY">FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY</a></td><td><a href="ft2-cff_driver.html#no-stem-darkening(cff)">no-stem-darkening (cff)</a></td></tr>
-<tr><td><a href="ft2-computations.html#FT_FloorFix">FT_FloorFix</a></td><td><a href="ft2-sfnt_names.html#FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY">FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_BLUE_FUZZ</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_FONT_FORMATS_H">FT_FONT_FORMATS_H</a></td><td><a href="ft2-incremental.html#FT_PARAM_TAG_INCREMENTAL">FT_PARAM_TAG_INCREMENTAL</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_BLUE_SCALE</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_FREETYPE_H">FT_FREETYPE_H</a></td><td><a href="ft2-lcd_filtering.html#FT_PARAM_TAG_LCD_FILTER_WEIGHTS">FT_PARAM_TAG_LCD_FILTER_WEIGHTS</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_BLUE_SHIFT</a></td></tr>
-<tr><td><a href="ft2-system_interface.html#FT_Free_Func">FT_Free_Func</a></td><td><a href="ft2-cff_driver.html#FT_PARAM_TAG_RANDOM_SEED">FT_PARAM_TAG_RANDOM_SEED</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_BLUE_VALUE</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FSTYPE_XXX">FT_FSTYPE_BITMAP_EMBEDDING_ONLY</a></td><td><a href="ft2-auto_hinter.html#FT_PARAM_TAG_STEM_DARKENING">FT_PARAM_TAG_STEM_DARKENING</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_CHAR_STRING</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FSTYPE_XXX">FT_FSTYPE_EDITABLE_EMBEDDING</a></td><td><a href="ft2-truetype_tables.html#FT_PARAM_TAG_UNPATENTED_HINTING">FT_PARAM_TAG_UNPATENTED_HINTING</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_CHAR_STRING_KEY</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FSTYPE_XXX">FT_FSTYPE_INSTALLABLE_EMBEDDING</a></td><td><a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_ENCODING_ENTRY</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FSTYPE_XXX">FT_FSTYPE_NO_SUBSETTING</a></td><td><a href="ft2-header_file_macros.html#FT_PCF_DRIVER_H">FT_PCF_DRIVER_H</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_ENCODING_TYPE</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FSTYPE_XXX">FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING</a></td><td><a href="ft2-header_file_macros.html#FT_PFR_H">FT_PFR_H</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FAMILY_BLUE</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FSTYPE_XXX">FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_BGRA</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FAMILY_NAME</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_FSTYPE_XXX">FT_FSTYPE_XXX</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_GRAY</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FAMILY_OTHER_BLUE</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_FWord">FT_FWord</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_GRAY2</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FONT_BBOX</a></td></tr>
-<tr><td><a href="ft2-gasp_table.html#FT_GASP_XXX">FT_GASP_DO_GRAY</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_GRAY4</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FONT_MATRIX</a></td></tr>
-<tr><td><a href="ft2-gasp_table.html#FT_GASP_XXX">FT_GASP_DO_GRIDFIT</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_LCD</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FONT_NAME</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_GASP_H">FT_GASP_H</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_LCD_V</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FONT_TYPE</a></td></tr>
-<tr><td><a href="ft2-gasp_table.html#FT_GASP_XXX">FT_GASP_NO_TABLE</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_MONO</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FORCE_BOLD</a></td></tr>
-<tr><td><a href="ft2-gasp_table.html#FT_GASP_XXX">FT_GASP_SYMMETRIC_GRIDFIT</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_NONE</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FS_TYPE</a></td></tr>
-<tr><td><a href="ft2-gasp_table.html#FT_GASP_XXX">FT_GASP_SYMMETRIC_SMOOTHING</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_Pixel_Mode</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FULL_NAME</a></td></tr>
-<tr><td><a href="ft2-gasp_table.html#FT_GASP_XXX">FT_GASP_XXX</a></td><td><a href="ft2-basic_types.html#FT_Pointer">FT_Pointer</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_IS_FIXED_PITCH</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Generic">FT_Generic</a></td><td><a href="ft2-basic_types.html#FT_Pos">FT_Pos</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_ITALIC_ANGLE</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Generic_Finalizer">FT_Generic_Finalizer</a></td><td><a href="ft2-auto_hinter.html#FT_Prop_GlyphToScriptMap">FT_Prop_GlyphToScriptMap</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_LANGUAGE_GROUP</a></td></tr>
-<tr><td><a href="ft2-quick_advance.html#FT_Get_Advance">FT_Get_Advance</a></td><td><a href="ft2-auto_hinter.html#FT_Prop_IncreaseXHeight">FT_Prop_IncreaseXHeight</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_LEN_IV</a></td></tr>
-<tr><td><a href="ft2-quick_advance.html#FT_Get_Advances">FT_Get_Advances</a></td><td><a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_MIN_FEATURE</a></td></tr>
-<tr><td><a href="ft2-bdf_fonts.html#FT_Get_BDF_Charset_ID">FT_Get_BDF_Charset_ID</a></td><td><a href="ft2-module_management.html#FT_Property_Set">FT_Property_Set</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NOTICE</a></td></tr>
-<tr><td><a href="ft2-bdf_fonts.html#FT_Get_BDF_Property">FT_Get_BDF_Property</a></td><td><a href="ft2-basic_types.html#FT_PtrDist">FT_PtrDist</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_BLUE_VALUES</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Get_Char_Index">FT_Get_Char_Index</a></td><td><a href="ft2-raster.html#FT_RASTER_FLAG_XXX">FT_RASTER_FLAG_AA</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_CHAR_STRINGS</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Get_Charmap_Index">FT_Get_Charmap_Index</a></td><td><a href="ft2-raster.html#FT_RASTER_FLAG_XXX">FT_RASTER_FLAG_CLIP</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_FAMILY_BLUES</a></td></tr>
-<tr><td><a href="ft2-cid_fonts.html#FT_Get_CID_From_Glyph_Index">FT_Get_CID_From_Glyph_Index</a></td><td><a href="ft2-raster.html#FT_RASTER_FLAG_XXX">FT_RASTER_FLAG_DEFAULT</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_FAMILY_OTHER_BLUES</a></td></tr>
-<tr><td><a href="ft2-cid_fonts.html#FT_Get_CID_Is_Internally_CID_Keyed">FT_Get_CID_Is_Internally_CID_Keyed</a></td><td><a href="ft2-raster.html#FT_RASTER_FLAG_XXX">FT_RASTER_FLAG_DIRECT</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_OTHER_BLUES</a></td></tr>
-<tr><td><a href="ft2-cid_fonts.html#FT_Get_CID_Registry_Ordering_Supplement">FT_Get_CID_Registry_Ordering_Supplement</a></td><td><a href="ft2-raster.html#FT_RASTER_FLAG_XXX">FT_RASTER_FLAG_XXX</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_STEM_SNAP_H</a></td></tr>
-<tr><td><a href="ft2-truetype_tables.html#FT_Get_CMap_Format">FT_Get_CMap_Format</a></td><td><a href="ft2-raster.html#FT_Raster">FT_Raster</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_STEM_SNAP_V</a></td></tr>
-<tr><td><a href="ft2-truetype_tables.html#FT_Get_CMap_Language_ID">FT_Get_CMap_Language_ID</a></td><td><a href="ft2-raster.html#FT_Raster_BitSet_Func">FT_Raster_BitSet_Func</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_SUBRS</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Get_First_Char">FT_Get_First_Char</a></td><td><a href="ft2-raster.html#FT_Raster_BitTest_Func">FT_Raster_BitTest_Func</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_OTHER_BLUE</a></td></tr>
-<tr><td><a href="ft2-font_formats.html#FT_Get_Font_Format">FT_Get_Font_Format</a></td><td><a href="ft2-raster.html#FT_Raster_DoneFunc">FT_Raster_DoneFunc</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_PAINT_TYPE</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Get_FSType_Flags">FT_Get_FSType_Flags</a></td><td><a href="ft2-raster.html#FT_Raster_Funcs">FT_Raster_Funcs</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_PASSWORD</a></td></tr>
-<tr><td><a href="ft2-gasp_table.html#FT_Get_Gasp">FT_Get_Gasp</a></td><td><a href="ft2-raster.html#FT_Raster_NewFunc">FT_Raster_NewFunc</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_RND_STEM_UP</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_Get_Glyph">FT_Get_Glyph</a></td><td><a href="ft2-raster.html#FT_Raster_Params">FT_Raster_Params</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_STD_HW</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Get_Glyph_Name">FT_Get_Glyph_Name</a></td><td><a href="ft2-raster.html#FT_Raster_RenderFunc">FT_Raster_RenderFunc</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_STD_VW</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Get_Kerning">FT_Get_Kerning</a></td><td><a href="ft2-raster.html#FT_Raster_ResetFunc">FT_Raster_ResetFunc</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_STEM_SNAP_H</a></td></tr>
-<tr><td><a href="ft2-multiple_masters.html#FT_Get_MM_Blend_Coordinates">FT_Get_MM_Blend_Coordinates</a></td><td><a href="ft2-raster.html#FT_Raster_SetModeFunc">FT_Raster_SetModeFunc</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_STEM_SNAP_V</a></td></tr>
-<tr><td><a href="ft2-multiple_masters.html#FT_Get_MM_Var">FT_Get_MM_Var</a></td><td><a href="ft2-header_file_macros.html#FT_RENDER_H">FT_RENDER_H</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_SUBR</a></td></tr>
-<tr><td><a href="ft2-module_management.html#FT_Get_Module">FT_Get_Module</a></td><td><a href="ft2-base_interface.html#FT_Render_Mode">FT_RENDER_MODE_LCD</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_UNDERLINE_POSITION</a></td></tr>
-<tr><td><a href="ft2-multiple_masters.html#FT_Get_Multi_Master">FT_Get_Multi_Master</a></td><td><a href="ft2-base_interface.html#FT_Render_Mode">FT_RENDER_MODE_LCD_V</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_UNDERLINE_THICKNESS</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Get_Name_Index">FT_Get_Name_Index</a></td><td><a href="ft2-base_interface.html#FT_Render_Mode">FT_RENDER_MODE_LIGHT</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_UNIQUE_ID</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Get_Next_Char">FT_Get_Next_Char</a></td><td><a href="ft2-base_interface.html#FT_Render_Mode">FT_RENDER_MODE_MONO</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_VERSION</a></td></tr>
-<tr><td><a href="ft2-pfr_fonts.html#FT_Get_PFR_Advance">FT_Get_PFR_Advance</a></td><td><a href="ft2-base_interface.html#FT_Render_Mode">FT_RENDER_MODE_NORMAL</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_WEIGHT</a></td></tr>
-<tr><td><a href="ft2-pfr_fonts.html#FT_Get_PFR_Kerning">FT_Get_PFR_Kerning</a></td><td><a href="ft2-system_interface.html#FT_Realloc_Func">FT_Realloc_Func</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_Dict_Keys</a></td></tr>
-<tr><td><a href="ft2-pfr_fonts.html#FT_Get_PFR_Metrics">FT_Get_PFR_Metrics</a></td><td><a href="ft2-base_interface.html#FT_Reference_Face">FT_Reference_Face</a></td><td><a href="ft2-type1_tables.html#PS_FontInfo">PS_FontInfo</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Get_Postscript_Name">FT_Get_Postscript_Name</a></td><td><a href="ft2-module_management.html#FT_Reference_Library">FT_Reference_Library</a></td><td><a href="ft2-type1_tables.html#PS_FontInfoRec">PS_FontInfoRec</a></td></tr>
-<tr><td><a href="ft2-type1_tables.html#FT_Get_PS_Font_Info">FT_Get_PS_Font_Info</a></td><td><a href="ft2-module_management.html#FT_Remove_Module">FT_Remove_Module</a></td><td><a href="ft2-type1_tables.html#PS_Private">PS_Private</a></td></tr>
-<tr><td><a href="ft2-type1_tables.html#FT_Get_PS_Font_Private">FT_Get_PS_Font_Private</a></td><td><a href="ft2-base_interface.html#FT_Render_Glyph">FT_Render_Glyph</a></td><td><a href="ft2-type1_tables.html#PS_PrivateRec">PS_PrivateRec</a></td></tr>
-<tr><td><a href="ft2-type1_tables.html#FT_Get_PS_Font_Value">FT_Get_PS_Font_Value</a></td><td><a href="ft2-base_interface.html#FT_Render_Mode">FT_Render_Mode</a></td><td><a href="ft2-cff_driver.html#random-seed">random-seed</a></td></tr>
-<tr><td><a href="ft2-module_management.html#FT_Get_Renderer">FT_Get_Renderer</a></td><td><a href="ft2-module_management.html#FT_Renderer">FT_Renderer</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_BLUE_SCALE</a></td></tr>
-<tr><td><a href="ft2-sfnt_names.html#FT_Get_Sfnt_LangTag">FT_Get_Sfnt_LangTag</a></td><td><a href="ft2-module_management.html#FT_Renderer_Class">FT_Renderer_Class</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_BLUE_SHIFT</a></td></tr>
-<tr><td><a href="ft2-sfnt_names.html#FT_Get_Sfnt_Name">FT_Get_Sfnt_Name</a></td><td><a href="ft2-base_interface.html#FT_Request_Size">FT_Request_Size</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_BLUE_VALUES</a></td></tr>
-<tr><td><a href="ft2-sfnt_names.html#FT_Get_Sfnt_Name_Count">FT_Get_Sfnt_Name_Count</a></td><td><a href="ft2-computations.html#FT_RoundFix">FT_RoundFix</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_FAMILY_BLUES</a></td></tr>
-<tr><td><a href="ft2-truetype_tables.html#FT_Get_Sfnt_Table">FT_Get_Sfnt_Table</a></td><td><a href="ft2-base_interface.html#FT_Select_Charmap">FT_Select_Charmap</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_FAMILY_OTHER_BLUES</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Get_SubGlyph_Info">FT_Get_SubGlyph_Info</a></td><td><a href="ft2-base_interface.html#FT_Select_Size">FT_Select_Size</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_FORCE_BOLD</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Get_Track_Kerning">FT_Get_Track_Kerning</a></td><td><a href="ft2-base_interface.html#FT_Set_Char_Size">FT_Set_Char_Size</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_ITALIC_ANGLE</a></td></tr>
-<tr><td><a href="ft2-truetype_engine.html#FT_Get_TrueType_Engine_Type">FT_Get_TrueType_Engine_Type</a></td><td><a href="ft2-base_interface.html#FT_Set_Charmap">FT_Set_Charmap</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_OTHER_BLUES</a></td></tr>
-<tr><td><a href="ft2-multiple_masters.html#FT_Get_Var_Blend_Coordinates">FT_Get_Var_Blend_Coordinates</a></td><td><a href="ft2-module_management.html#FT_Set_Debug_Hook">FT_Set_Debug_Hook</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_STANDARD_HEIGHT</a></td></tr>
-<tr><td><a href="ft2-multiple_masters.html#FT_Get_Var_Design_Coordinates">FT_Get_Var_Design_Coordinates</a></td><td><a href="ft2-module_management.html#FT_Set_Default_Properties">FT_Set_Default_Properties</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_STANDARD_WIDTH</a></td></tr>
-<tr><td><a href="ft2-winfnt_fonts.html#FT_Get_WinFNT_Header">FT_Get_WinFNT_Header</a></td><td><a href="ft2-multiple_masters.html#FT_Set_MM_Blend_Coordinates">FT_Set_MM_Blend_Coordinates</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_STEM_SNAP_HEIGHTS</a></td></tr>
-<tr><td><a href="ft2-mac_specific.html#FT_GetFile_From_Mac_ATS_Name">FT_GetFile_From_Mac_ATS_Name</a></td><td><a href="ft2-multiple_masters.html#FT_Set_MM_Design_Coordinates">FT_Set_MM_Design_Coordinates</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_STEM_SNAP_WIDTHS</a></td></tr>
-<tr><td><a href="ft2-mac_specific.html#FT_GetFile_From_Mac_Name">FT_GetFile_From_Mac_Name</a></td><td><a href="ft2-base_interface.html#FT_Set_Pixel_Sizes">FT_Set_Pixel_Sizes</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_UNDERLINE_POSITION</a></td></tr>
-<tr><td><a href="ft2-mac_specific.html#FT_GetFilePath_From_Mac_ATS_Name">FT_GetFilePath_From_Mac_ATS_Name</a></td><td><a href="ft2-module_management.html#FT_Set_Renderer">FT_Set_Renderer</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_UNDERLINE_THICKNESS</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_Glyph_BBox_Mode">FT_GLYPH_BBOX_GRIDFIT</a></td><td><a href="ft2-base_interface.html#FT_Set_Transform">FT_Set_Transform</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_Blend_Flags</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_Glyph_BBox_Mode">FT_GLYPH_BBOX_PIXELS</a></td><td><a href="ft2-multiple_masters.html#FT_Set_Var_Blend_Coordinates">FT_Set_Var_Blend_Coordinates</a></td><td><a href="ft2-type1_tables.html#T1_EncodingType">T1_ENCODING_TYPE_ARRAY</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_Glyph_BBox_Mode">FT_GLYPH_BBOX_SUBPIXELS</a></td><td><a href="ft2-multiple_masters.html#FT_Set_Var_Design_Coordinates">FT_Set_Var_Design_Coordinates</a></td><td><a href="ft2-type1_tables.html#T1_EncodingType">T1_ENCODING_TYPE_EXPERT</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_Glyph_BBox_Mode">FT_GLYPH_BBOX_TRUNCATE</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_SFNT_HEAD</a></td><td><a href="ft2-type1_tables.html#T1_EncodingType">T1_ENCODING_TYPE_ISOLATIN1</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_Glyph_BBox_Mode">FT_GLYPH_BBOX_UNSCALED</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_SFNT_HHEA</a></td><td><a href="ft2-type1_tables.html#T1_EncodingType">T1_ENCODING_TYPE_NONE</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_BITMAP</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_SFNT_MAXP</a></td><td><a href="ft2-type1_tables.html#T1_EncodingType">T1_ENCODING_TYPE_STANDARD</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_COMPOSITE</a></td><td><a href="ft2-header_file_macros.html#FT_SFNT_NAMES_H">FT_SFNT_NAMES_H</a></td><td><a href="ft2-type1_tables.html#T1_EncodingType">T1_EncodingType</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_NONE</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_SFNT_OS2</a></td><td><a href="ft2-type1_tables.html#T1_FontInfo">T1_FontInfo</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_OUTLINE</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_SFNT_PCLT</a></td><td><a href="ft2-type1_tables.html#T1_Private">T1_Private</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_PLOTTER</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_SFNT_POST</a></td><td><a href="ft2-truetype_tables.html#TT_ADOBE_ID_XXX">TT_ADOBE_ID_CUSTOM</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_GLYPH_H">FT_GLYPH_H</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_SFNT_VHEA</a></td><td><a href="ft2-truetype_tables.html#TT_ADOBE_ID_XXX">TT_ADOBE_ID_EXPERT</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_Glyph">FT_Glyph</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Table_Info">FT_Sfnt_Table_Info</a></td><td><a href="ft2-truetype_tables.html#TT_ADOBE_ID_XXX">TT_ADOBE_ID_LATIN_1</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_Glyph_BBox_Mode">FT_Glyph_BBox_Mode</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_Sfnt_Tag</a></td><td><a href="ft2-truetype_tables.html#TT_ADOBE_ID_XXX">TT_ADOBE_ID_STANDARD</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_Glyph_Copy">FT_Glyph_Copy</a></td><td><a href="ft2-sfnt_names.html#FT_SfntLangTag">FT_SfntLangTag</a></td><td><a href="ft2-truetype_tables.html#TT_ADOBE_ID_XXX">TT_ADOBE_ID_XXX</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Glyph_Format">FT_Glyph_Format</a></td><td><a href="ft2-sfnt_names.html#FT_SfntName">FT_SfntName</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_DEFAULT</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_Glyph_Get_CBox">FT_Glyph_Get_CBox</a></td><td><a href="ft2-basic_types.html#FT_Short">FT_Short</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_FULL_UNICODE</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Glyph_Metrics">FT_Glyph_Metrics</a></td><td><a href="ft2-base_interface.html#FT_Size_Request_Type">FT_SIZE_REQUEST_TYPE_BBOX</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_ISO_10646</a></td></tr>
-<tr><td><a href="ft2-glyph_stroker.html#FT_Glyph_Stroke">FT_Glyph_Stroke</a></td><td><a href="ft2-base_interface.html#FT_Size_Request_Type">FT_SIZE_REQUEST_TYPE_CELL</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_UNICODE_1_1</a></td></tr>
-<tr><td><a href="ft2-glyph_stroker.html#FT_Glyph_StrokeBorder">FT_Glyph_StrokeBorder</a></td><td><a href="ft2-base_interface.html#FT_Size_Request_Type">FT_SIZE_REQUEST_TYPE_NOMINAL</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_UNICODE_2_0</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_Glyph_To_Bitmap">FT_Glyph_To_Bitmap</a></td><td><a href="ft2-base_interface.html#FT_Size_Request_Type">FT_SIZE_REQUEST_TYPE_REAL_DIM</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_UNICODE_32</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_Glyph_Transform">FT_Glyph_Transform</a></td><td><a href="ft2-base_interface.html#FT_Size_Request_Type">FT_SIZE_REQUEST_TYPE_SCALES</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_VARIANT_SELECTOR</a></td></tr>
-<tr><td><a href="ft2-glyph_management.html#FT_GlyphRec">FT_GlyphRec</a></td><td><a href="ft2-header_file_macros.html#FT_SIZES_H">FT_SIZES_H</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_XXX</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_GlyphSlot">FT_GlyphSlot</a></td><td><a href="ft2-computations.html#FT_Sin">FT_Sin</a></td><td><a href="ft2-truetype_tables.html#TT_Header">TT_Header</a></td></tr>
-<tr><td><a href="ft2-bitmap_handling.html#FT_GlyphSlot_Own_Bitmap">FT_GlyphSlot_Own_Bitmap</a></td><td><a href="ft2-base_interface.html#FT_Size">FT_Size</a></td><td><a href="ft2-truetype_tables.html#TT_HoriHeader">TT_HoriHeader</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_GlyphSlotRec">FT_GlyphSlotRec</a></td><td><a href="ft2-base_interface.html#FT_Size_Internal">FT_Size_Internal</a></td><td><a href="ft2-tt_driver.html#TT_INTERPRETER_VERSION_XXX">TT_INTERPRETER_VERSION_35</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_GX_VALIDATE_H">FT_GX_VALIDATE_H</a></td><td><a href="ft2-base_interface.html#FT_Size_Metrics">FT_Size_Metrics</a></td><td><a href="ft2-tt_driver.html#TT_INTERPRETER_VERSION_XXX">TT_INTERPRETER_VERSION_38</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_GZIP_H">FT_GZIP_H</a></td><td><a href="ft2-base_interface.html#FT_Size_Request">FT_Size_Request</a></td><td><a href="ft2-tt_driver.html#TT_INTERPRETER_VERSION_XXX">TT_INTERPRETER_VERSION_40</a></td></tr>
-<tr><td><a href="ft2-gzip.html#FT_Gzip_Uncompress">FT_Gzip_Uncompress</a></td><td><a href="ft2-base_interface.html#FT_Size_Request_Type">FT_Size_Request_Type</a></td><td><a href="ft2-tt_driver.html#TT_INTERPRETER_VERSION_XXX">TT_INTERPRETER_VERSION_XXX</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_HAS_COLOR">FT_HAS_COLOR</a></td><td><a href="ft2-base_interface.html#FT_Size_RequestRec">FT_Size_RequestRec</a></td><td><a href="ft2-truetype_tables.html#TT_ISO_ID_XXX">TT_ISO_ID_10646</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_HAS_FAST_GLYPHS">FT_HAS_FAST_GLYPHS</a></td><td><a href="ft2-base_interface.html#FT_SizeRec">FT_SizeRec</a></td><td><a href="ft2-truetype_tables.html#TT_ISO_ID_XXX">TT_ISO_ID_7BIT_ASCII</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_HAS_FIXED_SIZES">FT_HAS_FIXED_SIZES</a></td><td><a href="ft2-base_interface.html#FT_Slot_Internal">FT_Slot_Internal</a></td><td><a href="ft2-truetype_tables.html#TT_ISO_ID_XXX">TT_ISO_ID_8859_1</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_HAS_GLYPH_NAMES">FT_HAS_GLYPH_NAMES</a></td><td><a href="ft2-raster.html#FT_Span">FT_Span</a></td><td><a href="ft2-truetype_tables.html#TT_ISO_ID_XXX">TT_ISO_ID_XXX</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_HAS_HORIZONTAL">FT_HAS_HORIZONTAL</a></td><td><a href="ft2-raster.html#FT_SpanFunc">FT_SpanFunc</a></td><td><a href="ft2-truetype_tables.html#TT_MAC_ID_XXX">TT_MAC_ID_XXX</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_HAS_KERNING">FT_HAS_KERNING</a></td><td><a href="ft2-glyph_stroker.html#FT_StrokerBorder">FT_STROKER_BORDER_LEFT</a></td><td><a href="ft2-truetype_tables.html#TT_MAC_LANGID_XXX">TT_MAC_LANGID_XXX</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_HAS_MULTIPLE_MASTERS">FT_HAS_MULTIPLE_MASTERS</a></td><td><a href="ft2-glyph_stroker.html#FT_StrokerBorder">FT_STROKER_BORDER_RIGHT</a></td><td><a href="ft2-truetype_tables.html#TT_MaxProfile">TT_MaxProfile</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_HAS_VERTICAL">FT_HAS_VERTICAL</a></td><td><a href="ft2-header_file_macros.html#FT_STROKER_H">FT_STROKER_H</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_BIG_5</a></td></tr>
-<tr><td><a href="ft2-type1_tables.html#FT_Has_PS_Glyph_Names">FT_Has_PS_Glyph_Names</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineCap">FT_STROKER_LINECAP_BUTT</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_JOHAB</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_IMAGE_H">FT_IMAGE_H</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineCap">FT_STROKER_LINECAP_ROUND</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_PRC</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_IMAGE_TAG">FT_IMAGE_TAG</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineCap">FT_STROKER_LINECAP_SQUARE</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_SJIS</a></td></tr>
-<tr><td><a href="ft2-header_file_macros.html#FT_INCREMENTAL_H">FT_INCREMENTAL_H</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineJoin">FT_STROKER_LINEJOIN_BEVEL</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_SYMBOL_CS</a></td></tr>
-<tr><td><a href="ft2-incremental.html#FT_Incremental">FT_Incremental</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineJoin">FT_STROKER_LINEJOIN_MITER</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_UCS_4</a></td></tr>
-<tr><td><a href="ft2-incremental.html#FT_Incremental_FreeGlyphDataFunc">FT_Incremental_FreeGlyphDataFunc</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineJoin">FT_STROKER_LINEJOIN_MITER_FIXED</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_UNICODE_CS</a></td></tr>
-<tr><td><a href="ft2-incremental.html#FT_Incremental_FuncsRec">FT_Incremental_FuncsRec</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineJoin">FT_STROKER_LINEJOIN_MITER_VARIABLE</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_WANSUNG</a></td></tr>
-<tr><td><a href="ft2-incremental.html#FT_Incremental_GetGlyphDataFunc">FT_Incremental_GetGlyphDataFunc</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineJoin">FT_STROKER_LINEJOIN_ROUND</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_XXX</a></td></tr>
-<tr><td><a href="ft2-incremental.html#FT_Incremental_GetGlyphMetricsFunc">FT_Incremental_GetGlyphMetricsFunc</a></td><td><a href="ft2-base_interface.html#FT_STYLE_FLAG_XXX">FT_STYLE_FLAG_BOLD</a></td><td><a href="ft2-truetype_tables.html#TT_MS_LANGID_XXX">TT_MS_LANGID_XXX</a></td></tr>
-<tr><td><a href="ft2-incremental.html#FT_Incremental_Interface">FT_Incremental_Interface</a></td><td><a href="ft2-base_interface.html#FT_STYLE_FLAG_XXX">FT_STYLE_FLAG_ITALIC</a></td><td><a href="ft2-truetype_tables.html#TT_NAME_ID_XXX">TT_NAME_ID_XXX</a></td></tr>
-<tr><td><a href="ft2-incremental.html#FT_Incremental_InterfaceRec">FT_Incremental_InterfaceRec</a></td><td><a href="ft2-base_interface.html#FT_STYLE_FLAG_XXX">FT_STYLE_FLAG_XXX</a></td><td><a href="ft2-truetype_tables.html#TT_OS2">TT_OS2</a></td></tr>
-<tr><td><a href="ft2-incremental.html#FT_Incremental_Metrics">FT_Incremental_Metrics</a></td><td><a href="ft2-system_interface.html#FT_Stream">FT_Stream</a></td><td><a href="ft2-truetype_tables.html#TT_PCLT">TT_PCLT</a></td></tr>
-<tr><td><a href="ft2-incremental.html#FT_Incremental_MetricsRec">FT_Incremental_MetricsRec</a></td><td><a href="ft2-system_interface.html#FT_Stream_CloseFunc">FT_Stream_CloseFunc</a></td><td><a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_ADOBE</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Init_FreeType">FT_Init_FreeType</a></td><td><a href="ft2-system_interface.html#FT_Stream_IoFunc">FT_Stream_IoFunc</a></td><td><a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_APPLE_UNICODE</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Int">FT_Int</a></td><td><a href="ft2-bzip2.html#FT_Stream_OpenBzip2">FT_Stream_OpenBzip2</a></td><td><a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_CUSTOM</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Int16">FT_Int16</a></td><td><a href="ft2-gzip.html#FT_Stream_OpenGzip">FT_Stream_OpenGzip</a></td><td><a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_ISO</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Int32">FT_Int32</a></td><td><a href="ft2-lzw.html#FT_Stream_OpenLZW">FT_Stream_OpenLZW</a></td><td><a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_MACINTOSH</a></td></tr>
-<tr><td><a href="ft2-basic_types.html#FT_Int64">FT_Int64</a></td><td><a href="ft2-system_interface.html#FT_StreamDesc">FT_StreamDesc</a></td><td><a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_MICROSOFT</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_IS_CID_KEYED">FT_IS_CID_KEYED</a></td><td><a href="ft2-system_interface.html#FT_StreamRec">FT_StreamRec</a></td><td><a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_XXX</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_IS_FIXED_WIDTH">FT_IS_FIXED_WIDTH</a></td><td><a href="ft2-basic_types.html#FT_String">FT_String</a></td><td><a href="ft2-truetype_tables.html#TT_Postscript">TT_Postscript</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_IS_NAMED_INSTANCE">FT_IS_NAMED_INSTANCE</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker">FT_Stroker</a></td><td><a href="ft2-truetype_tables.html#TT_UCR_XXX">TT_UCR_XXX</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_IS_SCALABLE">FT_IS_SCALABLE</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_BeginSubPath">FT_Stroker_BeginSubPath</a></td><td><a href="ft2-truetype_tables.html#TT_VertHeader">TT_VertHeader</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_IS_SFNT">FT_IS_SFNT</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_ConicTo">FT_Stroker_ConicTo</a></td><td><a href="ft2-auto_hinter.html#warping">warping</a></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_IS_TRICKY">FT_IS_TRICKY</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_CubicTo">FT_Stroker_CubicTo</a></td><td></td></tr>
-<tr><td><a href="ft2-base_interface.html#FT_Kerning_Mode">FT_KERNING_DEFAULT</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_Done">FT_Stroker_Done</a></td><td></td></tr>
+<tr><td><a href="ft2-bdf_fonts.html#BDF_PropertyType">BDF_PROPERTY_TYPE_ATOM</a></td><td><a href="ft2-base_interface.html#FT_Kerning_Mode">FT_KERNING_UNFITTED</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_Done">FT_Stroker_Done</a></td></tr>
+<tr><td><a href="ft2-bdf_fonts.html#BDF_PropertyType">BDF_PROPERTY_TYPE_CARDINAL</a></td><td><a href="ft2-base_interface.html#FT_Kerning_Mode">FT_KERNING_UNSCALED</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_EndSubPath">FT_Stroker_EndSubPath</a></td></tr>
+<tr><td><a href="ft2-bdf_fonts.html#BDF_PropertyType">BDF_PROPERTY_TYPE_INTEGER</a></td><td><a href="ft2-base_interface.html#FT_Kerning_Mode">FT_Kerning_Mode</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_Export">FT_Stroker_Export</a></td></tr>
+<tr><td><a href="ft2-bdf_fonts.html#BDF_PropertyType">BDF_PROPERTY_TYPE_NONE</a></td><td><a href="ft2-lcd_filtering.html#FT_LcdFilter">FT_LCD_FILTER_DEFAULT</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_ExportBorder">FT_Stroker_ExportBorder</a></td></tr>
+<tr><td><a href="ft2-bdf_fonts.html#BDF_Property">BDF_Property</a></td><td><a href="ft2-header_file_macros.html#FT_LCD_FILTER_H">FT_LCD_FILTER_H</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_GetBorderCounts">FT_Stroker_GetBorderCounts</a></td></tr>
+<tr><td><a href="ft2-bdf_fonts.html#BDF_PropertyRec">BDF_PropertyRec</a></td><td><a href="ft2-lcd_filtering.html#FT_LcdFilter">FT_LCD_FILTER_LEGACY</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_GetCounts">FT_Stroker_GetCounts</a></td></tr>
+<tr><td><a href="ft2-bdf_fonts.html#BDF_PropertyType">BDF_PropertyType</a></td><td><a href="ft2-lcd_filtering.html#FT_LcdFilter">FT_LCD_FILTER_LEGACY1</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineCap">FT_Stroker_LineCap</a></td></tr>
+<tr><td><a href="ft2-type1_tables.html#CID_FaceDict">CID_FaceDict</a></td><td><a href="ft2-lcd_filtering.html#FT_LcdFilter">FT_LCD_FILTER_LIGHT</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineJoin">FT_Stroker_LineJoin</a></td></tr>
+<tr><td><a href="ft2-type1_tables.html#CID_FaceDictRec">CID_FaceDictRec</a></td><td><a href="ft2-lcd_filtering.html#FT_LcdFilter">FT_LCD_FILTER_NONE</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineTo">FT_Stroker_LineTo</a></td></tr>
+<tr><td><a href="ft2-type1_tables.html#CID_FaceInfo">CID_FaceInfo</a></td><td><a href="ft2-lcd_filtering.html#FT_LcdFilter">FT_LcdFilter</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_New">FT_Stroker_New</a></td></tr>
+<tr><td><a href="ft2-type1_tables.html#CID_FaceInfoRec">CID_FaceInfoRec</a></td><td><a href="ft2-header_file_macros.html#FT_LIST_H">FT_LIST_H</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_ParseOutline">FT_Stroker_ParseOutline</a></td></tr>
+<tr><td><a href="ft2-type1_tables.html#CID_FontDict">CID_FontDict</a></td><td><a href="ft2-base_interface.html#FT_Library">FT_Library</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_Rewind">FT_Stroker_Rewind</a></td></tr>
+<tr><td><a href="ft2-type1_tables.html#CID_Info">CID_Info</a></td><td><a href="ft2-lcd_filtering.html#FT_Library_SetLcdFilter">FT_Library_SetLcdFilter</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_Set">FT_Stroker_Set</a></td></tr>
+<tr><td><a href="ft2-properties.html#darkening-parameters">darkening-parameters</a></td><td><a href="ft2-lcd_filtering.html#FT_Library_SetLcdFilterWeights">FT_Library_SetLcdFilterWeights</a></td><td><a href="ft2-glyph_stroker.html#FT_StrokerBorder">FT_StrokerBorder</a></td></tr>
+<tr><td><a href="ft2-properties.html#default-script">default-script</a></td><td><a href="ft2-version.html#FT_Library_Version">FT_Library_Version</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_2X2</a></td></tr>
+<tr><td><a href="ft2-version.html#FREETYPE_XXX">FREETYPE_MAJOR</a></td><td><a href="ft2-list_processing.html#FT_List">FT_List</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_ARGS_ARE_WORDS</a></td></tr>
+<tr><td><a href="ft2-version.html#FREETYPE_XXX">FREETYPE_MINOR</a></td><td><a href="ft2-list_processing.html#FT_List_Add">FT_List_Add</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES</a></td></tr>
+<tr><td><a href="ft2-version.html#FREETYPE_XXX">FREETYPE_PATCH</a></td><td><a href="ft2-list_processing.html#FT_List_Destructor">FT_List_Destructor</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID</a></td></tr>
+<tr><td><a href="ft2-version.html#FREETYPE_XXX">FREETYPE_XXX</a></td><td><a href="ft2-list_processing.html#FT_List_Finalize">FT_List_Finalize</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_SCALE</a></td></tr>
+<tr><td><a href="ft2-sizes_management.html#FT_Activate_Size">FT_Activate_Size</a></td><td><a href="ft2-list_processing.html#FT_List_Find">FT_List_Find</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_USE_MY_METRICS</a></td></tr>
+<tr><td><a href="ft2-quick_advance.html#FT_ADVANCE_FLAG_FAST_ONLY">FT_ADVANCE_FLAG_FAST_ONLY</a></td><td><a href="ft2-list_processing.html#FT_List_Insert">FT_List_Insert</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_XXX</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_ADVANCES_H">FT_ADVANCES_H</a></td><td><a href="ft2-list_processing.html#FT_List_Iterate">FT_List_Iterate</a></td><td><a href="ft2-base_interface.html#FT_SUBGLYPH_FLAG_XXX">FT_SUBGLYPH_FLAG_XY_SCALE</a></td></tr>
+<tr><td><a href="ft2-module_management.html#FT_Add_Default_Modules">FT_Add_Default_Modules</a></td><td><a href="ft2-list_processing.html#FT_List_Iterator">FT_List_Iterator</a></td><td><a href="ft2-base_interface.html#FT_SubGlyph">FT_SubGlyph</a></td></tr>
+<tr><td><a href="ft2-module_management.html#FT_Add_Module">FT_Add_Module</a></td><td><a href="ft2-list_processing.html#FT_List_Remove">FT_List_Remove</a></td><td><a href="ft2-header_file_macros.html#FT_SYNTHESIS_H">FT_SYNTHESIS_H</a></td></tr>
+<tr><td><a href="ft2-system_interface.html#FT_Alloc_Func">FT_Alloc_Func</a></td><td><a href="ft2-list_processing.html#FT_List_Up">FT_List_Up</a></td><td><a href="ft2-header_file_macros.html#FT_SYSTEM_H">FT_SYSTEM_H</a></td></tr>
+<tr><td><a href="ft2-computations.html#FT_ANGLE_2PI">FT_ANGLE_2PI</a></td><td><a href="ft2-list_processing.html#FT_ListNode">FT_ListNode</a></td><td><a href="ft2-basic_types.html#FT_Tag">FT_Tag</a></td></tr>
+<tr><td><a href="ft2-computations.html#FT_ANGLE_PI">FT_ANGLE_PI</a></td><td><a href="ft2-list_processing.html#FT_ListNodeRec">FT_ListNodeRec</a></td><td><a href="ft2-computations.html#FT_Tan">FT_Tan</a></td></tr>
+<tr><td><a href="ft2-computations.html#FT_ANGLE_PI2">FT_ANGLE_PI2</a></td><td><a href="ft2-list_processing.html#FT_ListRec">FT_ListRec</a></td><td><a href="ft2-header_file_macros.html#FT_TRIGONOMETRY_H">FT_TRIGONOMETRY_H</a></td></tr>
+<tr><td><a href="ft2-computations.html#FT_ANGLE_PI4">FT_ANGLE_PI4</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_BITMAP_METRICS_ONLY</a></td><td><a href="ft2-header_file_macros.html#FT_TRUETYPE_DRIVER_H">FT_TRUETYPE_DRIVER_H</a></td></tr>
+<tr><td><a href="ft2-computations.html#FT_Angle">FT_Angle</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_COLOR</a></td><td><a href="ft2-truetype_engine.html#FT_TrueTypeEngineType">FT_TRUETYPE_ENGINE_TYPE_NONE</a></td></tr>
+<tr><td><a href="ft2-computations.html#FT_Angle_Diff">FT_Angle_Diff</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_COMPUTE_METRICS</a></td><td><a href="ft2-truetype_engine.html#FT_TrueTypeEngineType">FT_TRUETYPE_ENGINE_TYPE_PATENTED</a></td></tr>
+<tr><td><a href="ft2-computations.html#FT_Atan2">FT_Atan2</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_CROP_BITMAP</a></td><td><a href="ft2-truetype_engine.html#FT_TrueTypeEngineType">FT_TRUETYPE_ENGINE_TYPE_UNPATENTED</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Attach_File">FT_Attach_File</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_DEFAULT</a></td><td><a href="ft2-header_file_macros.html#FT_TRUETYPE_IDS_H">FT_TRUETYPE_IDS_H</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Attach_Stream">FT_Attach_Stream</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_FORCE_AUTOHINT</a></td><td><a href="ft2-header_file_macros.html#FT_TRUETYPE_TABLES_H">FT_TRUETYPE_TABLES_H</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_AUTOHINTER_H">FT_AUTOHINTER_H</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH</a></td><td><a href="ft2-header_file_macros.html#FT_TRUETYPE_TAGS_H">FT_TRUETYPE_TAGS_H</a></td></tr>
+<tr><td><a href="ft2-properties.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_CJK</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_IGNORE_TRANSFORM</a></td><td><a href="ft2-truetype_engine.html#FT_TrueTypeEngineType">FT_TrueTypeEngineType</a></td></tr>
+<tr><td><a href="ft2-properties.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_INDIC</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_LINEAR_DESIGN</a></td><td><a href="ft2-gx_validation.html#FT_TrueTypeGX_Free">FT_TrueTypeGX_Free</a></td></tr>
+<tr><td><a href="ft2-properties.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_LATIN</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_MONOCHROME</a></td><td><a href="ft2-gx_validation.html#FT_TrueTypeGX_Validate">FT_TrueTypeGX_Validate</a></td></tr>
+<tr><td><a href="ft2-properties.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_NONE</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_NO_AUTOHINT</a></td><td><a href="ft2-header_file_macros.html#FT_TYPE1_TABLES_H">FT_TYPE1_TABLES_H</a></td></tr>
+<tr><td><a href="ft2-properties.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_XXX</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_NO_BITMAP</a></td><td><a href="ft2-header_file_macros.html#FT_TYPES_H">FT_TYPES_H</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_BBOX_H">FT_BBOX_H</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_NO_HINTING</a></td><td><a href="ft2-basic_types.html#FT_UFWord">FT_UFWord</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_BBox">FT_BBox</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_NO_RECURSE</a></td><td><a href="ft2-basic_types.html#FT_UInt">FT_UInt</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_BDF_H">FT_BDF_H</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_NO_SCALE</a></td><td><a href="ft2-basic_types.html#FT_UInt16">FT_UInt16</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_BITMAP_H">FT_BITMAP_H</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_PEDANTIC</a></td><td><a href="ft2-basic_types.html#FT_UInt32">FT_UInt32</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Bitmap">FT_Bitmap</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_RENDER</a></td><td><a href="ft2-basic_types.html#FT_UInt64">FT_UInt64</a></td></tr>
+<tr><td><a href="ft2-bitmap_handling.html#FT_Bitmap_Convert">FT_Bitmap_Convert</a></td><td><a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_LCD</a></td><td><a href="ft2-basic_types.html#FT_ULong">FT_ULong</a></td></tr>
+<tr><td><a href="ft2-bitmap_handling.html#FT_Bitmap_Copy">FT_Bitmap_Copy</a></td><td><a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_LCD_V</a></td><td><a href="ft2-basic_types.html#FT_UnitVector">FT_UnitVector</a></td></tr>
+<tr><td><a href="ft2-bitmap_handling.html#FT_Bitmap_Done">FT_Bitmap_Done</a></td><td><a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_LIGHT</a></td><td><a href="ft2-basic_types.html#FT_UShort">FT_UShort</a></td></tr>
+<tr><td><a href="ft2-bitmap_handling.html#FT_Bitmap_Embolden">FT_Bitmap_Embolden</a></td><td><a href="ft2-base_interface.html#FT_LOAD_TARGET_MODE">FT_LOAD_TARGET_MODE</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_CKERNXXX">FT_VALIDATE_APPLE</a></td></tr>
+<tr><td><a href="ft2-bitmap_handling.html#FT_Bitmap_Init">FT_Bitmap_Init</a></td><td><a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_MONO</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_BASE</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Bitmap_Size">FT_Bitmap_Size</a></td><td><a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_NORMAL</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_bsln</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_BitmapGlyph">FT_BitmapGlyph</a></td><td><a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_XXX</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_CKERNXXX">FT_VALIDATE_CKERN</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_BitmapGlyphRec">FT_BitmapGlyphRec</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_VERTICAL_LAYOUT</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_CKERNXXX">FT_VALIDATE_CKERNXXX</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Bool">FT_Bool</a></td><td><a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_XXX</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_feat</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Byte">FT_Byte</a></td><td><a href="ft2-base_interface.html#FT_Load_Char">FT_Load_Char</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_GDEF</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Bytes">FT_Bytes</a></td><td><a href="ft2-base_interface.html#FT_Load_Glyph">FT_Load_Glyph</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_GPOS</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_BZIP2_H">FT_BZIP2_H</a></td><td><a href="ft2-truetype_tables.html#FT_Load_Sfnt_Table">FT_Load_Sfnt_Table</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_GSUB</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_CACHE_H">FT_CACHE_H</a></td><td><a href="ft2-basic_types.html#FT_Long">FT_Long</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_GX</a></td></tr>
+<tr><td><a href="ft2-computations.html#FT_CeilFix">FT_CeilFix</a></td><td><a href="ft2-header_file_macros.html#FT_LZW_H">FT_LZW_H</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GX_LENGTH">FT_VALIDATE_GX_LENGTH</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_CFF_DRIVER_H">FT_CFF_DRIVER_H</a></td><td><a href="ft2-header_file_macros.html#FT_MAC_H">FT_MAC_H</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_GXXXX</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Char">FT_Char</a></td><td><a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_JSTF</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_CharMap">FT_CharMap</a></td><td><a href="ft2-basic_types.html#FT_Matrix">FT_Matrix</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_just</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_CharMapRec">FT_CharMapRec</a></td><td><a href="ft2-computations.html#FT_Matrix_Invert">FT_Matrix_Invert</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_kern</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_CID_H">FT_CID_H</a></td><td><a href="ft2-computations.html#FT_Matrix_Multiply">FT_Matrix_Multiply</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_lcar</a></td></tr>
+<tr><td><a href="ft2-gx_validation.html#FT_ClassicKern_Free">FT_ClassicKern_Free</a></td><td><a href="ft2-system_interface.html#FT_Memory">FT_Memory</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_MATH</a></td></tr>
+<tr><td><a href="ft2-gx_validation.html#FT_ClassicKern_Validate">FT_ClassicKern_Validate</a></td><td><a href="ft2-system_interface.html#FT_MemoryRec">FT_MemoryRec</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_CKERNXXX">FT_VALIDATE_MS</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_CONFIG_CONFIG_H">FT_CONFIG_CONFIG_H</a></td><td><a href="ft2-multiple_masters.html#FT_MM_Axis">FT_MM_Axis</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_mort</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_CONFIG_MODULES_H">FT_CONFIG_MODULES_H</a></td><td><a href="ft2-multiple_masters.html#FT_MM_Var">FT_MM_Var</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_morx</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_CONFIG_OPTIONS_H">FT_CONFIG_OPTIONS_H</a></td><td><a href="ft2-header_file_macros.html#FT_MODULE_ERRORS_H">FT_MODULE_ERRORS_H</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_OT</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_CONFIG_STANDARD_LIBRARY_H">FT_CONFIG_STANDARD_LIBRARY_H</a></td><td><a href="ft2-header_file_macros.html#FT_MODULE_H">FT_MODULE_H</a></td><td><a href="ft2-ot_validation.html#FT_VALIDATE_OTXXX">FT_VALIDATE_OTXXX</a></td></tr>
+<tr><td><a href="ft2-computations.html#FT_Cos">FT_Cos</a></td><td><a href="ft2-module_management.html#FT_Module">FT_Module</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_opbd</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Data">FT_Data</a></td><td><a href="ft2-module_management.html#FT_Module_Class">FT_Module_Class</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_prop</a></td></tr>
+<tr><td><a href="ft2-computations.html#FT_DivFix">FT_DivFix</a></td><td><a href="ft2-module_management.html#FT_Module_Constructor">FT_Module_Constructor</a></td><td><a href="ft2-gx_validation.html#FT_VALIDATE_GXXXX">FT_VALIDATE_trak</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Done_Face">FT_Done_Face</a></td><td><a href="ft2-module_management.html#FT_Module_Destructor">FT_Module_Destructor</a></td><td><a href="ft2-multiple_masters.html#FT_VAR_AXIS_FLAG_XXX">FT_VAR_AXIS_FLAG_HIDDEN</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Done_FreeType">FT_Done_FreeType</a></td><td><a href="ft2-module_management.html#FT_Module_Requester">FT_Module_Requester</a></td><td><a href="ft2-multiple_masters.html#FT_VAR_AXIS_FLAG_XXX">FT_VAR_AXIS_FLAG_XXX</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_Done_Glyph">FT_Done_Glyph</a></td><td><a href="ft2-header_file_macros.html#FT_MULTIPLE_MASTERS_H">FT_MULTIPLE_MASTERS_H</a></td><td><a href="ft2-multiple_masters.html#FT_Var_Axis">FT_Var_Axis</a></td></tr>
+<tr><td><a href="ft2-module_management.html#FT_Done_Library">FT_Done_Library</a></td><td><a href="ft2-computations.html#FT_MulDiv">FT_MulDiv</a></td><td><a href="ft2-multiple_masters.html#FT_Var_Named_Style">FT_Var_Named_Style</a></td></tr>
+<tr><td><a href="ft2-multiple_masters.html#FT_Done_MM_Var">FT_Done_MM_Var</a></td><td><a href="ft2-computations.html#FT_MulFix">FT_MulFix</a></td><td><a href="ft2-basic_types.html#FT_Vector">FT_Vector</a></td></tr>
+<tr><td><a href="ft2-sizes_management.html#FT_Done_Size">FT_Done_Size</a></td><td><a href="ft2-multiple_masters.html#FT_Multi_Master">FT_Multi_Master</a></td><td><a href="ft2-computations.html#FT_Vector_From_Polar">FT_Vector_From_Polar</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_DRIVER_H">FT_DRIVER_H</a></td><td><a href="ft2-base_interface.html#FT_New_Face">FT_New_Face</a></td><td><a href="ft2-computations.html#FT_Vector_Length">FT_Vector_Length</a></td></tr>
+<tr><td><a href="ft2-module_management.html#FT_Driver">FT_Driver</a></td><td><a href="ft2-mac_specific.html#FT_New_Face_From_FOND">FT_New_Face_From_FOND</a></td><td><a href="ft2-computations.html#FT_Vector_Polarize">FT_Vector_Polarize</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_ENC_TAG">FT_ENC_TAG</a></td><td><a href="ft2-mac_specific.html#FT_New_Face_From_FSRef">FT_New_Face_From_FSRef</a></td><td><a href="ft2-computations.html#FT_Vector_Rotate">FT_Vector_Rotate</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_ADOBE_CUSTOM</a></td><td><a href="ft2-mac_specific.html#FT_New_Face_From_FSSpec">FT_New_Face_From_FSSpec</a></td><td><a href="ft2-computations.html#FT_Vector_Transform">FT_Vector_Transform</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_ADOBE_EXPERT</a></td><td><a href="ft2-module_management.html#FT_New_Library">FT_New_Library</a></td><td><a href="ft2-computations.html#FT_Vector_Unit">FT_Vector_Unit</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_ADOBE_LATIN_1</a></td><td><a href="ft2-base_interface.html#FT_New_Memory_Face">FT_New_Memory_Face</a></td><td><a href="ft2-header_file_macros.html#FT_WINFONTS_H">FT_WINFONTS_H</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_ADOBE_STANDARD</a></td><td><a href="ft2-sizes_management.html#FT_New_Size">FT_New_Size</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_Header">FT_WinFNT_Header</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_APPLE_ROMAN</a></td><td><a href="ft2-basic_types.html#FT_Offset">FT_Offset</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_HeaderRec">FT_WinFNT_HeaderRec</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_BIG5</a></td><td><a href="ft2-base_interface.html#FT_OPEN_XXX">FT_OPEN_DRIVER</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1250</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_JOHAB</a></td><td><a href="ft2-base_interface.html#FT_OPEN_XXX">FT_OPEN_MEMORY</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1251</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_MS_BIG5</a></td><td><a href="ft2-base_interface.html#FT_OPEN_XXX">FT_OPEN_PARAMS</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1252</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_MS_GB2312</a></td><td><a href="ft2-base_interface.html#FT_OPEN_XXX">FT_OPEN_PATHNAME</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1253</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_MS_JOHAB</a></td><td><a href="ft2-base_interface.html#FT_OPEN_XXX">FT_OPEN_STREAM</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1254</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_MS_SJIS</a></td><td><a href="ft2-base_interface.html#FT_OPEN_XXX">FT_OPEN_XXX</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1255</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_MS_SYMBOL</a></td><td><a href="ft2-header_file_macros.html#FT_OPENTYPE_VALIDATE_H">FT_OPENTYPE_VALIDATE_H</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1256</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_MS_WANSUNG</a></td><td><a href="ft2-base_interface.html#FT_Open_Args">FT_Open_Args</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1257</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_NONE</a></td><td><a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1258</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_OLD_LATIN_2</a></td><td><a href="ft2-ot_validation.html#FT_OpenType_Free">FT_OpenType_Free</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP1361</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_PRC</a></td><td><a href="ft2-ot_validation.html#FT_OpenType_Validate">FT_OpenType_Validate</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP874</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_SJIS</a></td><td><a href="ft2-outline_processing.html#FT_Orientation">FT_ORIENTATION_FILL_LEFT</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP932</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_UNICODE</a></td><td><a href="ft2-outline_processing.html#FT_Orientation">FT_ORIENTATION_FILL_RIGHT</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP936</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_ENCODING_WANSUNG</a></td><td><a href="ft2-outline_processing.html#FT_Orientation">FT_ORIENTATION_NONE</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP949</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Encoding">FT_Encoding</a></td><td><a href="ft2-outline_processing.html#FT_Orientation">FT_ORIENTATION_POSTSCRIPT</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_CP950</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_ERRORS_H">FT_ERRORS_H</a></td><td><a href="ft2-outline_processing.html#FT_Orientation">FT_ORIENTATION_TRUETYPE</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_DEFAULT</a></td></tr>
+<tr><td><a href="ft2-error_code_values.html#FT_Err_XXX">FT_Err_XXX</a></td><td><a href="ft2-outline_processing.html#FT_Orientation">FT_Orientation</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_MAC</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Error">FT_Error</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_EVEN_ODD_FILL</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_OEM</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_F26Dot6">FT_F26Dot6</a></td><td><a href="ft2-header_file_macros.html#FT_OUTLINE_H">FT_OUTLINE_H</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_SYMBOL</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_F2Dot14">FT_F2Dot14</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_HIGH_PRECISION</a></td><td><a href="ft2-winfnt_fonts.html#FT_WinFNT_ID_XXX">FT_WinFNT_ID_XXX</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_CID_KEYED</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_IGNORE_DROPOUTS</a></td><td><a href="ft2-cache_subsystem.html#FTC_CMapCache">FTC_CMapCache</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_COLOR</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_INCLUDE_STUBS</a></td><td><a href="ft2-cache_subsystem.html#FTC_CMapCache_Lookup">FTC_CMapCache_Lookup</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_EXTERNAL_STREAM</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_NONE</a></td><td><a href="ft2-cache_subsystem.html#FTC_CMapCache_New">FTC_CMapCache_New</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_FAST_GLYPHS</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_OWNER</a></td><td><a href="ft2-cache_subsystem.html#FTC_Face_Requester">FTC_Face_Requester</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_FIXED_SIZES</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_REVERSE_FILL</a></td><td><a href="ft2-cache_subsystem.html#FTC_FaceID">FTC_FaceID</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_FIXED_WIDTH</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_SINGLE_PASS</a></td><td><a href="ft2-cache_subsystem.html#FTC_ImageCache">FTC_ImageCache</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_GLYPH_NAMES</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_SMART_DROPOUTS</a></td><td><a href="ft2-cache_subsystem.html#FTC_ImageCache_Lookup">FTC_ImageCache_Lookup</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_HINTER</a></td><td><a href="ft2-outline_processing.html#FT_OUTLINE_XXX">FT_OUTLINE_XXX</a></td><td><a href="ft2-cache_subsystem.html#FTC_ImageCache_LookupScaler">FTC_ImageCache_LookupScaler</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_HORIZONTAL</a></td><td><a href="ft2-outline_processing.html#FT_Outline">FT_Outline</a></td><td><a href="ft2-cache_subsystem.html#FTC_ImageCache_New">FTC_ImageCache_New</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_KERNING</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Check">FT_Outline_Check</a></td><td><a href="ft2-cache_subsystem.html#FTC_ImageType">FTC_ImageType</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_MULTIPLE_MASTERS</a></td><td><a href="ft2-outline_processing.html#FT_Outline_ConicToFunc">FT_Outline_ConicToFunc</a></td><td><a href="ft2-cache_subsystem.html#FTC_ImageTypeRec">FTC_ImageTypeRec</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_SCALABLE</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Copy">FT_Outline_Copy</a></td><td><a href="ft2-cache_subsystem.html#FTC_Manager">FTC_Manager</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_SFNT</a></td><td><a href="ft2-outline_processing.html#FT_Outline_CubicToFunc">FT_Outline_CubicToFunc</a></td><td><a href="ft2-cache_subsystem.html#FTC_Manager_Done">FTC_Manager_Done</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_TRICKY</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Decompose">FT_Outline_Decompose</a></td><td><a href="ft2-cache_subsystem.html#FTC_Manager_LookupFace">FTC_Manager_LookupFace</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_VARIATION</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Done">FT_Outline_Done</a></td><td><a href="ft2-cache_subsystem.html#FTC_Manager_LookupSize">FTC_Manager_LookupSize</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_VERTICAL</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Embolden">FT_Outline_Embolden</a></td><td><a href="ft2-cache_subsystem.html#FTC_Manager_New">FTC_Manager_New</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_XXX</a></td><td><a href="ft2-outline_processing.html#FT_Outline_EmboldenXY">FT_Outline_EmboldenXY</a></td><td><a href="ft2-cache_subsystem.html#FTC_Manager_RemoveFaceID">FTC_Manager_RemoveFaceID</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Face">FT_Face</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Funcs">FT_Outline_Funcs</a></td><td><a href="ft2-cache_subsystem.html#FTC_Manager_Reset">FTC_Manager_Reset</a></td></tr>
+<tr><td><a href="ft2-version.html#FT_Face_CheckTrueTypePatents">FT_Face_CheckTrueTypePatents</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Get_BBox">FT_Outline_Get_BBox</a></td><td><a href="ft2-cache_subsystem.html#FTC_Node">FTC_Node</a></td></tr>
+<tr><td><a href="ft2-glyph_variants.html#FT_Face_GetCharsOfVariant">FT_Face_GetCharsOfVariant</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Get_Bitmap">FT_Outline_Get_Bitmap</a></td><td><a href="ft2-cache_subsystem.html#FTC_Node_Unref">FTC_Node_Unref</a></td></tr>
+<tr><td><a href="ft2-glyph_variants.html#FT_Face_GetCharVariantIndex">FT_Face_GetCharVariantIndex</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Get_CBox">FT_Outline_Get_CBox</a></td><td><a href="ft2-cache_subsystem.html#FTC_SBit">FTC_SBit</a></td></tr>
+<tr><td><a href="ft2-glyph_variants.html#FT_Face_GetCharVariantIsDefault">FT_Face_GetCharVariantIsDefault</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Get_Orientation">FT_Outline_Get_Orientation</a></td><td><a href="ft2-cache_subsystem.html#FTC_SBitCache">FTC_SBitCache</a></td></tr>
+<tr><td><a href="ft2-glyph_variants.html#FT_Face_GetVariantSelectors">FT_Face_GetVariantSelectors</a></td><td><a href="ft2-glyph_stroker.html#FT_Outline_GetInsideBorder">FT_Outline_GetInsideBorder</a></td><td><a href="ft2-cache_subsystem.html#FTC_SBitCache_Lookup">FTC_SBitCache_Lookup</a></td></tr>
+<tr><td><a href="ft2-glyph_variants.html#FT_Face_GetVariantsOfChar">FT_Face_GetVariantsOfChar</a></td><td><a href="ft2-glyph_stroker.html#FT_Outline_GetOutsideBorder">FT_Outline_GetOutsideBorder</a></td><td><a href="ft2-cache_subsystem.html#FTC_SBitCache_LookupScaler">FTC_SBitCache_LookupScaler</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Face_Internal">FT_Face_Internal</a></td><td><a href="ft2-outline_processing.html#FT_Outline_LineToFunc">FT_Outline_LineToFunc</a></td><td><a href="ft2-cache_subsystem.html#FTC_SBitCache_New">FTC_SBitCache_New</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a></td><td><a href="ft2-outline_processing.html#FT_Outline_MoveToFunc">FT_Outline_MoveToFunc</a></td><td><a href="ft2-cache_subsystem.html#FTC_SBitRec">FTC_SBitRec</a></td></tr>
+<tr><td><a href="ft2-version.html#FT_Face_SetUnpatentedHinting">FT_Face_SetUnpatentedHinting</a></td><td><a href="ft2-outline_processing.html#FT_Outline_New">FT_Outline_New</a></td><td><a href="ft2-cache_subsystem.html#FTC_Scaler">FTC_Scaler</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FaceRec">FT_FaceRec</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Render">FT_Outline_Render</a></td><td><a href="ft2-cache_subsystem.html#FTC_ScalerRec">FTC_ScalerRec</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Fixed">FT_Fixed</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Reverse">FT_Outline_Reverse</a></td><td><a href="ft2-properties.html#fallback-script">fallback-script</a></td></tr>
+<tr><td><a href="ft2-computations.html#FT_FloorFix">FT_FloorFix</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Transform">FT_Outline_Transform</a></td><td><a href="ft2-properties.html#glyph-to-script-map">glyph-to-script-map</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_FONT_FORMATS_H">FT_FONT_FORMATS_H</a></td><td><a href="ft2-outline_processing.html#FT_Outline_Translate">FT_Outline_Translate</a></td><td><a href="ft2-properties.html#hinting-engine">hinting-engine</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_FREETYPE_H">FT_FREETYPE_H</a></td><td><a href="ft2-glyph_management.html#FT_OutlineGlyph">FT_OutlineGlyph</a></td><td><a href="ft2-properties.html#increase-x-height">increase-x-height</a></td></tr>
+<tr><td><a href="ft2-system_interface.html#FT_Free_Func">FT_Free_Func</a></td><td><a href="ft2-glyph_management.html#FT_OutlineGlyphRec">FT_OutlineGlyphRec</a></td><td><a href="ft2-properties.html#interpreter-version">interpreter-version</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FSTYPE_XXX">FT_FSTYPE_BITMAP_EMBEDDING_ONLY</a></td><td><a href="ft2-parameter_tags.html#FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY">FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY</a></td><td><a href="ft2-properties.html#no-long-family-names">no-long-family-names</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FSTYPE_XXX">FT_FSTYPE_EDITABLE_EMBEDDING</a></td><td><a href="ft2-parameter_tags.html#FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY">FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY</a></td><td><a href="ft2-properties.html#no-stem-darkening">no-stem-darkening</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FSTYPE_XXX">FT_FSTYPE_INSTALLABLE_EMBEDDING</a></td><td><a href="ft2-parameter_tags.html#FT_PARAM_TAG_INCREMENTAL">FT_PARAM_TAG_INCREMENTAL</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_BLUE_FUZZ</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FSTYPE_XXX">FT_FSTYPE_NO_SUBSETTING</a></td><td><a href="ft2-parameter_tags.html#FT_PARAM_TAG_LCD_FILTER_WEIGHTS">FT_PARAM_TAG_LCD_FILTER_WEIGHTS</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_BLUE_SCALE</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FSTYPE_XXX">FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING</a></td><td><a href="ft2-parameter_tags.html#FT_PARAM_TAG_RANDOM_SEED">FT_PARAM_TAG_RANDOM_SEED</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_BLUE_SHIFT</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FSTYPE_XXX">FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING</a></td><td><a href="ft2-parameter_tags.html#FT_PARAM_TAG_STEM_DARKENING">FT_PARAM_TAG_STEM_DARKENING</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_BLUE_VALUE</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_FSTYPE_XXX">FT_FSTYPE_XXX</a></td><td><a href="ft2-parameter_tags.html#FT_PARAM_TAG_UNPATENTED_HINTING">FT_PARAM_TAG_UNPATENTED_HINTING</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_CHAR_STRING</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_FWord">FT_FWord</a></td><td><a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_CHAR_STRING_KEY</a></td></tr>
+<tr><td><a href="ft2-gasp_table.html#FT_GASP_XXX">FT_GASP_DO_GRAY</a></td><td><a href="ft2-header_file_macros.html#FT_PCF_DRIVER_H">FT_PCF_DRIVER_H</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_ENCODING_ENTRY</a></td></tr>
+<tr><td><a href="ft2-gasp_table.html#FT_GASP_XXX">FT_GASP_DO_GRIDFIT</a></td><td><a href="ft2-header_file_macros.html#FT_PFR_H">FT_PFR_H</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_ENCODING_TYPE</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_GASP_H">FT_GASP_H</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_BGRA</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FAMILY_BLUE</a></td></tr>
+<tr><td><a href="ft2-gasp_table.html#FT_GASP_XXX">FT_GASP_NO_TABLE</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_GRAY</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FAMILY_NAME</a></td></tr>
+<tr><td><a href="ft2-gasp_table.html#FT_GASP_XXX">FT_GASP_SYMMETRIC_GRIDFIT</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_GRAY2</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FAMILY_OTHER_BLUE</a></td></tr>
+<tr><td><a href="ft2-gasp_table.html#FT_GASP_XXX">FT_GASP_SYMMETRIC_SMOOTHING</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_GRAY4</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FONT_BBOX</a></td></tr>
+<tr><td><a href="ft2-gasp_table.html#FT_GASP_XXX">FT_GASP_XXX</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_LCD</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FONT_MATRIX</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Generic">FT_Generic</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_LCD_V</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FONT_NAME</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Generic_Finalizer">FT_Generic_Finalizer</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_MONO</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FONT_TYPE</a></td></tr>
+<tr><td><a href="ft2-quick_advance.html#FT_Get_Advance">FT_Get_Advance</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_PIXEL_MODE_NONE</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FORCE_BOLD</a></td></tr>
+<tr><td><a href="ft2-quick_advance.html#FT_Get_Advances">FT_Get_Advances</a></td><td><a href="ft2-basic_types.html#FT_Pixel_Mode">FT_Pixel_Mode</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FS_TYPE</a></td></tr>
+<tr><td><a href="ft2-bdf_fonts.html#FT_Get_BDF_Charset_ID">FT_Get_BDF_Charset_ID</a></td><td><a href="ft2-basic_types.html#FT_Pointer">FT_Pointer</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_FULL_NAME</a></td></tr>
+<tr><td><a href="ft2-bdf_fonts.html#FT_Get_BDF_Property">FT_Get_BDF_Property</a></td><td><a href="ft2-basic_types.html#FT_Pos">FT_Pos</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_IS_FIXED_PITCH</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Get_Char_Index">FT_Get_Char_Index</a></td><td><a href="ft2-properties.html#FT_Prop_GlyphToScriptMap">FT_Prop_GlyphToScriptMap</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_ITALIC_ANGLE</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Get_Charmap_Index">FT_Get_Charmap_Index</a></td><td><a href="ft2-properties.html#FT_Prop_IncreaseXHeight">FT_Prop_IncreaseXHeight</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_LANGUAGE_GROUP</a></td></tr>
+<tr><td><a href="ft2-cid_fonts.html#FT_Get_CID_From_Glyph_Index">FT_Get_CID_From_Glyph_Index</a></td><td><a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_LEN_IV</a></td></tr>
+<tr><td><a href="ft2-cid_fonts.html#FT_Get_CID_Is_Internally_CID_Keyed">FT_Get_CID_Is_Internally_CID_Keyed</a></td><td><a href="ft2-module_management.html#FT_Property_Set">FT_Property_Set</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_MIN_FEATURE</a></td></tr>
+<tr><td><a href="ft2-cid_fonts.html#FT_Get_CID_Registry_Ordering_Supplement">FT_Get_CID_Registry_Ordering_Supplement</a></td><td><a href="ft2-basic_types.html#FT_PtrDist">FT_PtrDist</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NOTICE</a></td></tr>
+<tr><td><a href="ft2-truetype_tables.html#FT_Get_CMap_Format">FT_Get_CMap_Format</a></td><td><a href="ft2-raster.html#FT_RASTER_FLAG_XXX">FT_RASTER_FLAG_AA</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_BLUE_VALUES</a></td></tr>
+<tr><td><a href="ft2-truetype_tables.html#FT_Get_CMap_Language_ID">FT_Get_CMap_Language_ID</a></td><td><a href="ft2-raster.html#FT_RASTER_FLAG_XXX">FT_RASTER_FLAG_CLIP</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_CHAR_STRINGS</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Get_First_Char">FT_Get_First_Char</a></td><td><a href="ft2-raster.html#FT_RASTER_FLAG_XXX">FT_RASTER_FLAG_DEFAULT</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_FAMILY_BLUES</a></td></tr>
+<tr><td><a href="ft2-font_formats.html#FT_Get_Font_Format">FT_Get_Font_Format</a></td><td><a href="ft2-raster.html#FT_RASTER_FLAG_XXX">FT_RASTER_FLAG_DIRECT</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_FAMILY_OTHER_BLUES</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Get_FSType_Flags">FT_Get_FSType_Flags</a></td><td><a href="ft2-raster.html#FT_RASTER_FLAG_XXX">FT_RASTER_FLAG_XXX</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_OTHER_BLUES</a></td></tr>
+<tr><td><a href="ft2-gasp_table.html#FT_Get_Gasp">FT_Get_Gasp</a></td><td><a href="ft2-raster.html#FT_Raster">FT_Raster</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_STEM_SNAP_H</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_Get_Glyph">FT_Get_Glyph</a></td><td><a href="ft2-raster.html#FT_Raster_BitSet_Func">FT_Raster_BitSet_Func</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_STEM_SNAP_V</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Get_Glyph_Name">FT_Get_Glyph_Name</a></td><td><a href="ft2-raster.html#FT_Raster_BitTest_Func">FT_Raster_BitTest_Func</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_NUM_SUBRS</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Get_Kerning">FT_Get_Kerning</a></td><td><a href="ft2-raster.html#FT_Raster_DoneFunc">FT_Raster_DoneFunc</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_OTHER_BLUE</a></td></tr>
+<tr><td><a href="ft2-multiple_masters.html#FT_Get_MM_Blend_Coordinates">FT_Get_MM_Blend_Coordinates</a></td><td><a href="ft2-raster.html#FT_Raster_Funcs">FT_Raster_Funcs</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_PAINT_TYPE</a></td></tr>
+<tr><td><a href="ft2-multiple_masters.html#FT_Get_MM_Var">FT_Get_MM_Var</a></td><td><a href="ft2-raster.html#FT_Raster_NewFunc">FT_Raster_NewFunc</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_PASSWORD</a></td></tr>
+<tr><td><a href="ft2-module_management.html#FT_Get_Module">FT_Get_Module</a></td><td><a href="ft2-raster.html#FT_Raster_Params">FT_Raster_Params</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_RND_STEM_UP</a></td></tr>
+<tr><td><a href="ft2-multiple_masters.html#FT_Get_Multi_Master">FT_Get_Multi_Master</a></td><td><a href="ft2-raster.html#FT_Raster_RenderFunc">FT_Raster_RenderFunc</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_STD_HW</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Get_Name_Index">FT_Get_Name_Index</a></td><td><a href="ft2-raster.html#FT_Raster_ResetFunc">FT_Raster_ResetFunc</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_STD_VW</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Get_Next_Char">FT_Get_Next_Char</a></td><td><a href="ft2-raster.html#FT_Raster_SetModeFunc">FT_Raster_SetModeFunc</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_STEM_SNAP_H</a></td></tr>
+<tr><td><a href="ft2-pfr_fonts.html#FT_Get_PFR_Advance">FT_Get_PFR_Advance</a></td><td><a href="ft2-header_file_macros.html#FT_RENDER_H">FT_RENDER_H</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_STEM_SNAP_V</a></td></tr>
+<tr><td><a href="ft2-pfr_fonts.html#FT_Get_PFR_Kerning">FT_Get_PFR_Kerning</a></td><td><a href="ft2-base_interface.html#FT_Render_Mode">FT_RENDER_MODE_LCD</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_SUBR</a></td></tr>
+<tr><td><a href="ft2-pfr_fonts.html#FT_Get_PFR_Metrics">FT_Get_PFR_Metrics</a></td><td><a href="ft2-base_interface.html#FT_Render_Mode">FT_RENDER_MODE_LCD_V</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_UNDERLINE_POSITION</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Get_Postscript_Name">FT_Get_Postscript_Name</a></td><td><a href="ft2-base_interface.html#FT_Render_Mode">FT_RENDER_MODE_LIGHT</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_UNDERLINE_THICKNESS</a></td></tr>
+<tr><td><a href="ft2-type1_tables.html#FT_Get_PS_Font_Info">FT_Get_PS_Font_Info</a></td><td><a href="ft2-base_interface.html#FT_Render_Mode">FT_RENDER_MODE_MONO</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_UNIQUE_ID</a></td></tr>
+<tr><td><a href="ft2-type1_tables.html#FT_Get_PS_Font_Private">FT_Get_PS_Font_Private</a></td><td><a href="ft2-base_interface.html#FT_Render_Mode">FT_RENDER_MODE_NORMAL</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_VERSION</a></td></tr>
+<tr><td><a href="ft2-type1_tables.html#FT_Get_PS_Font_Value">FT_Get_PS_Font_Value</a></td><td><a href="ft2-system_interface.html#FT_Realloc_Func">FT_Realloc_Func</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_DICT_WEIGHT</a></td></tr>
+<tr><td><a href="ft2-module_management.html#FT_Get_Renderer">FT_Get_Renderer</a></td><td><a href="ft2-base_interface.html#FT_Reference_Face">FT_Reference_Face</a></td><td><a href="ft2-type1_tables.html#PS_Dict_Keys">PS_Dict_Keys</a></td></tr>
+<tr><td><a href="ft2-sfnt_names.html#FT_Get_Sfnt_LangTag">FT_Get_Sfnt_LangTag</a></td><td><a href="ft2-module_management.html#FT_Reference_Library">FT_Reference_Library</a></td><td><a href="ft2-type1_tables.html#PS_FontInfo">PS_FontInfo</a></td></tr>
+<tr><td><a href="ft2-sfnt_names.html#FT_Get_Sfnt_Name">FT_Get_Sfnt_Name</a></td><td><a href="ft2-module_management.html#FT_Remove_Module">FT_Remove_Module</a></td><td><a href="ft2-type1_tables.html#PS_FontInfoRec">PS_FontInfoRec</a></td></tr>
+<tr><td><a href="ft2-sfnt_names.html#FT_Get_Sfnt_Name_Count">FT_Get_Sfnt_Name_Count</a></td><td><a href="ft2-base_interface.html#FT_Render_Glyph">FT_Render_Glyph</a></td><td><a href="ft2-type1_tables.html#PS_Private">PS_Private</a></td></tr>
+<tr><td><a href="ft2-truetype_tables.html#FT_Get_Sfnt_Table">FT_Get_Sfnt_Table</a></td><td><a href="ft2-base_interface.html#FT_Render_Mode">FT_Render_Mode</a></td><td><a href="ft2-type1_tables.html#PS_PrivateRec">PS_PrivateRec</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Get_SubGlyph_Info">FT_Get_SubGlyph_Info</a></td><td><a href="ft2-module_management.html#FT_Renderer">FT_Renderer</a></td><td><a href="ft2-properties.html#random-seed">random-seed</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Get_Track_Kerning">FT_Get_Track_Kerning</a></td><td><a href="ft2-module_management.html#FT_Renderer_Class">FT_Renderer_Class</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_BLUE_SCALE</a></td></tr>
+<tr><td><a href="ft2-truetype_engine.html#FT_Get_TrueType_Engine_Type">FT_Get_TrueType_Engine_Type</a></td><td><a href="ft2-base_interface.html#FT_Request_Size">FT_Request_Size</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_BLUE_SHIFT</a></td></tr>
+<tr><td><a href="ft2-multiple_masters.html#FT_Get_Var_Axis_Flags">FT_Get_Var_Axis_Flags</a></td><td><a href="ft2-computations.html#FT_RoundFix">FT_RoundFix</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_BLUE_VALUES</a></td></tr>
+<tr><td><a href="ft2-multiple_masters.html#FT_Get_Var_Blend_Coordinates">FT_Get_Var_Blend_Coordinates</a></td><td><a href="ft2-base_interface.html#FT_Select_Charmap">FT_Select_Charmap</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_FAMILY_BLUES</a></td></tr>
+<tr><td><a href="ft2-multiple_masters.html#FT_Get_Var_Design_Coordinates">FT_Get_Var_Design_Coordinates</a></td><td><a href="ft2-base_interface.html#FT_Select_Size">FT_Select_Size</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_FAMILY_OTHER_BLUES</a></td></tr>
+<tr><td><a href="ft2-winfnt_fonts.html#FT_Get_WinFNT_Header">FT_Get_WinFNT_Header</a></td><td><a href="ft2-base_interface.html#FT_Set_Char_Size">FT_Set_Char_Size</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_FORCE_BOLD</a></td></tr>
+<tr><td><a href="ft2-mac_specific.html#FT_GetFile_From_Mac_ATS_Name">FT_GetFile_From_Mac_ATS_Name</a></td><td><a href="ft2-base_interface.html#FT_Set_Charmap">FT_Set_Charmap</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_ITALIC_ANGLE</a></td></tr>
+<tr><td><a href="ft2-mac_specific.html#FT_GetFile_From_Mac_Name">FT_GetFile_From_Mac_Name</a></td><td><a href="ft2-module_management.html#FT_Set_Debug_Hook">FT_Set_Debug_Hook</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_OTHER_BLUES</a></td></tr>
+<tr><td><a href="ft2-mac_specific.html#FT_GetFilePath_From_Mac_ATS_Name">FT_GetFilePath_From_Mac_ATS_Name</a></td><td><a href="ft2-module_management.html#FT_Set_Default_Properties">FT_Set_Default_Properties</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_STANDARD_HEIGHT</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_Glyph_BBox_Mode">FT_GLYPH_BBOX_GRIDFIT</a></td><td><a href="ft2-multiple_masters.html#FT_Set_MM_Blend_Coordinates">FT_Set_MM_Blend_Coordinates</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_STANDARD_WIDTH</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_Glyph_BBox_Mode">FT_GLYPH_BBOX_PIXELS</a></td><td><a href="ft2-multiple_masters.html#FT_Set_MM_Design_Coordinates">FT_Set_MM_Design_Coordinates</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_STEM_SNAP_HEIGHTS</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_Glyph_BBox_Mode">FT_GLYPH_BBOX_SUBPIXELS</a></td><td><a href="ft2-multiple_masters.html#FT_Set_Named_Instance">FT_Set_Named_Instance</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_STEM_SNAP_WIDTHS</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_Glyph_BBox_Mode">FT_GLYPH_BBOX_TRUNCATE</a></td><td><a href="ft2-base_interface.html#FT_Set_Pixel_Sizes">FT_Set_Pixel_Sizes</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_UNDERLINE_POSITION</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_Glyph_BBox_Mode">FT_GLYPH_BBOX_UNSCALED</a></td><td><a href="ft2-module_management.html#FT_Set_Renderer">FT_Set_Renderer</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_BLEND_UNDERLINE_THICKNESS</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_BITMAP</a></td><td><a href="ft2-base_interface.html#FT_Set_Transform">FT_Set_Transform</a></td><td><a href="ft2-type1_tables.html#T1_Blend_Flags">T1_Blend_Flags</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_COMPOSITE</a></td><td><a href="ft2-multiple_masters.html#FT_Set_Var_Blend_Coordinates">FT_Set_Var_Blend_Coordinates</a></td><td><a href="ft2-type1_tables.html#T1_EncodingType">T1_ENCODING_TYPE_ARRAY</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_NONE</a></td><td><a href="ft2-multiple_masters.html#FT_Set_Var_Design_Coordinates">FT_Set_Var_Design_Coordinates</a></td><td><a href="ft2-type1_tables.html#T1_EncodingType">T1_ENCODING_TYPE_EXPERT</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_OUTLINE</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_SFNT_HEAD</a></td><td><a href="ft2-type1_tables.html#T1_EncodingType">T1_ENCODING_TYPE_ISOLATIN1</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Glyph_Format">FT_GLYPH_FORMAT_PLOTTER</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_SFNT_HHEA</a></td><td><a href="ft2-type1_tables.html#T1_EncodingType">T1_ENCODING_TYPE_NONE</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_GLYPH_H">FT_GLYPH_H</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_SFNT_MAXP</a></td><td><a href="ft2-type1_tables.html#T1_EncodingType">T1_ENCODING_TYPE_STANDARD</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_Glyph">FT_Glyph</a></td><td><a href="ft2-header_file_macros.html#FT_SFNT_NAMES_H">FT_SFNT_NAMES_H</a></td><td><a href="ft2-type1_tables.html#T1_EncodingType">T1_EncodingType</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_Glyph_BBox_Mode">FT_Glyph_BBox_Mode</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_SFNT_OS2</a></td><td><a href="ft2-type1_tables.html#T1_FontInfo">T1_FontInfo</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_Glyph_Copy">FT_Glyph_Copy</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_SFNT_PCLT</a></td><td><a href="ft2-type1_tables.html#T1_Private">T1_Private</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Glyph_Format">FT_Glyph_Format</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_SFNT_POST</a></td><td><a href="ft2-truetype_tables.html#TT_ADOBE_ID_XXX">TT_ADOBE_ID_CUSTOM</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_Glyph_Get_CBox">FT_Glyph_Get_CBox</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_SFNT_VHEA</a></td><td><a href="ft2-truetype_tables.html#TT_ADOBE_ID_XXX">TT_ADOBE_ID_EXPERT</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Glyph_Metrics">FT_Glyph_Metrics</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Table_Info">FT_Sfnt_Table_Info</a></td><td><a href="ft2-truetype_tables.html#TT_ADOBE_ID_XXX">TT_ADOBE_ID_LATIN_1</a></td></tr>
+<tr><td><a href="ft2-glyph_stroker.html#FT_Glyph_Stroke">FT_Glyph_Stroke</a></td><td><a href="ft2-truetype_tables.html#FT_Sfnt_Tag">FT_Sfnt_Tag</a></td><td><a href="ft2-truetype_tables.html#TT_ADOBE_ID_XXX">TT_ADOBE_ID_STANDARD</a></td></tr>
+<tr><td><a href="ft2-glyph_stroker.html#FT_Glyph_StrokeBorder">FT_Glyph_StrokeBorder</a></td><td><a href="ft2-sfnt_names.html#FT_SfntLangTag">FT_SfntLangTag</a></td><td><a href="ft2-truetype_tables.html#TT_ADOBE_ID_XXX">TT_ADOBE_ID_XXX</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_Glyph_To_Bitmap">FT_Glyph_To_Bitmap</a></td><td><a href="ft2-sfnt_names.html#FT_SfntName">FT_SfntName</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_DEFAULT</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_Glyph_Transform">FT_Glyph_Transform</a></td><td><a href="ft2-basic_types.html#FT_Short">FT_Short</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_FULL_UNICODE</a></td></tr>
+<tr><td><a href="ft2-glyph_management.html#FT_GlyphRec">FT_GlyphRec</a></td><td><a href="ft2-base_interface.html#FT_Size_Request_Type">FT_SIZE_REQUEST_TYPE_BBOX</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_ISO_10646</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_GlyphSlot">FT_GlyphSlot</a></td><td><a href="ft2-base_interface.html#FT_Size_Request_Type">FT_SIZE_REQUEST_TYPE_CELL</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_UNICODE_1_1</a></td></tr>
+<tr><td><a href="ft2-bitmap_handling.html#FT_GlyphSlot_Own_Bitmap">FT_GlyphSlot_Own_Bitmap</a></td><td><a href="ft2-base_interface.html#FT_Size_Request_Type">FT_SIZE_REQUEST_TYPE_NOMINAL</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_UNICODE_2_0</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_GlyphSlotRec">FT_GlyphSlotRec</a></td><td><a href="ft2-base_interface.html#FT_Size_Request_Type">FT_SIZE_REQUEST_TYPE_REAL_DIM</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_UNICODE_32</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_GX_VALIDATE_H">FT_GX_VALIDATE_H</a></td><td><a href="ft2-base_interface.html#FT_Size_Request_Type">FT_SIZE_REQUEST_TYPE_SCALES</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_VARIANT_SELECTOR</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_GZIP_H">FT_GZIP_H</a></td><td><a href="ft2-header_file_macros.html#FT_SIZES_H">FT_SIZES_H</a></td><td><a href="ft2-truetype_tables.html#TT_APPLE_ID_XXX">TT_APPLE_ID_XXX</a></td></tr>
+<tr><td><a href="ft2-gzip.html#FT_Gzip_Uncompress">FT_Gzip_Uncompress</a></td><td><a href="ft2-computations.html#FT_Sin">FT_Sin</a></td><td><a href="ft2-truetype_tables.html#TT_Header">TT_Header</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_HAS_COLOR">FT_HAS_COLOR</a></td><td><a href="ft2-base_interface.html#FT_Size">FT_Size</a></td><td><a href="ft2-truetype_tables.html#TT_HoriHeader">TT_HoriHeader</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_HAS_FAST_GLYPHS">FT_HAS_FAST_GLYPHS</a></td><td><a href="ft2-base_interface.html#FT_Size_Internal">FT_Size_Internal</a></td><td><a href="ft2-properties.html#TT_INTERPRETER_VERSION_XXX">TT_INTERPRETER_VERSION_35</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_HAS_FIXED_SIZES">FT_HAS_FIXED_SIZES</a></td><td><a href="ft2-base_interface.html#FT_Size_Metrics">FT_Size_Metrics</a></td><td><a href="ft2-properties.html#TT_INTERPRETER_VERSION_XXX">TT_INTERPRETER_VERSION_38</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_HAS_GLYPH_NAMES">FT_HAS_GLYPH_NAMES</a></td><td><a href="ft2-base_interface.html#FT_Size_Request">FT_Size_Request</a></td><td><a href="ft2-properties.html#TT_INTERPRETER_VERSION_XXX">TT_INTERPRETER_VERSION_40</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_HAS_HORIZONTAL">FT_HAS_HORIZONTAL</a></td><td><a href="ft2-base_interface.html#FT_Size_Request_Type">FT_Size_Request_Type</a></td><td><a href="ft2-properties.html#TT_INTERPRETER_VERSION_XXX">TT_INTERPRETER_VERSION_XXX</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_HAS_KERNING">FT_HAS_KERNING</a></td><td><a href="ft2-base_interface.html#FT_Size_RequestRec">FT_Size_RequestRec</a></td><td><a href="ft2-truetype_tables.html#TT_ISO_ID_XXX">TT_ISO_ID_10646</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_HAS_MULTIPLE_MASTERS">FT_HAS_MULTIPLE_MASTERS</a></td><td><a href="ft2-base_interface.html#FT_SizeRec">FT_SizeRec</a></td><td><a href="ft2-truetype_tables.html#TT_ISO_ID_XXX">TT_ISO_ID_7BIT_ASCII</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_HAS_VERTICAL">FT_HAS_VERTICAL</a></td><td><a href="ft2-base_interface.html#FT_Slot_Internal">FT_Slot_Internal</a></td><td><a href="ft2-truetype_tables.html#TT_ISO_ID_XXX">TT_ISO_ID_8859_1</a></td></tr>
+<tr><td><a href="ft2-type1_tables.html#FT_Has_PS_Glyph_Names">FT_Has_PS_Glyph_Names</a></td><td><a href="ft2-raster.html#FT_Span">FT_Span</a></td><td><a href="ft2-truetype_tables.html#TT_ISO_ID_XXX">TT_ISO_ID_XXX</a></td></tr>
+<tr><td><a href="ft2-properties.html#FT_HINTING_XXX">FT_HINTING_ADOBE</a></td><td><a href="ft2-raster.html#FT_SpanFunc">FT_SpanFunc</a></td><td><a href="ft2-truetype_tables.html#TT_MAC_ID_XXX">TT_MAC_ID_XXX</a></td></tr>
+<tr><td><a href="ft2-properties.html#FT_HINTING_XXX">FT_HINTING_FREETYPE</a></td><td><a href="ft2-glyph_stroker.html#FT_StrokerBorder">FT_STROKER_BORDER_LEFT</a></td><td><a href="ft2-truetype_tables.html#TT_MAC_LANGID_XXX">TT_MAC_LANGID_XXX</a></td></tr>
+<tr><td><a href="ft2-properties.html#FT_HINTING_XXX">FT_HINTING_XXX</a></td><td><a href="ft2-glyph_stroker.html#FT_StrokerBorder">FT_STROKER_BORDER_RIGHT</a></td><td><a href="ft2-truetype_tables.html#TT_MaxProfile">TT_MaxProfile</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_IMAGE_H">FT_IMAGE_H</a></td><td><a href="ft2-header_file_macros.html#FT_STROKER_H">FT_STROKER_H</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_BIG_5</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_IMAGE_TAG">FT_IMAGE_TAG</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineCap">FT_STROKER_LINECAP_BUTT</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_JOHAB</a></td></tr>
+<tr><td><a href="ft2-header_file_macros.html#FT_INCREMENTAL_H">FT_INCREMENTAL_H</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineCap">FT_STROKER_LINECAP_ROUND</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_PRC</a></td></tr>
+<tr><td><a href="ft2-incremental.html#FT_Incremental">FT_Incremental</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineCap">FT_STROKER_LINECAP_SQUARE</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_SJIS</a></td></tr>
+<tr><td><a href="ft2-incremental.html#FT_Incremental_FreeGlyphDataFunc">FT_Incremental_FreeGlyphDataFunc</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineJoin">FT_STROKER_LINEJOIN_BEVEL</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_SYMBOL_CS</a></td></tr>
+<tr><td><a href="ft2-incremental.html#FT_Incremental_FuncsRec">FT_Incremental_FuncsRec</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineJoin">FT_STROKER_LINEJOIN_MITER</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_UCS_4</a></td></tr>
+<tr><td><a href="ft2-incremental.html#FT_Incremental_GetGlyphDataFunc">FT_Incremental_GetGlyphDataFunc</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineJoin">FT_STROKER_LINEJOIN_MITER_FIXED</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_UNICODE_CS</a></td></tr>
+<tr><td><a href="ft2-incremental.html#FT_Incremental_GetGlyphMetricsFunc">FT_Incremental_GetGlyphMetricsFunc</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineJoin">FT_STROKER_LINEJOIN_MITER_VARIABLE</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_WANSUNG</a></td></tr>
+<tr><td><a href="ft2-incremental.html#FT_Incremental_Interface">FT_Incremental_Interface</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_LineJoin">FT_STROKER_LINEJOIN_ROUND</a></td><td><a href="ft2-truetype_tables.html#TT_MS_ID_XXX">TT_MS_ID_XXX</a></td></tr>
+<tr><td><a href="ft2-incremental.html#FT_Incremental_InterfaceRec">FT_Incremental_InterfaceRec</a></td><td><a href="ft2-base_interface.html#FT_STYLE_FLAG_XXX">FT_STYLE_FLAG_BOLD</a></td><td><a href="ft2-truetype_tables.html#TT_MS_LANGID_XXX">TT_MS_LANGID_XXX</a></td></tr>
+<tr><td><a href="ft2-incremental.html#FT_Incremental_Metrics">FT_Incremental_Metrics</a></td><td><a href="ft2-base_interface.html#FT_STYLE_FLAG_XXX">FT_STYLE_FLAG_ITALIC</a></td><td><a href="ft2-truetype_tables.html#TT_NAME_ID_XXX">TT_NAME_ID_XXX</a></td></tr>
+<tr><td><a href="ft2-incremental.html#FT_Incremental_MetricsRec">FT_Incremental_MetricsRec</a></td><td><a href="ft2-base_interface.html#FT_STYLE_FLAG_XXX">FT_STYLE_FLAG_XXX</a></td><td><a href="ft2-truetype_tables.html#TT_OS2">TT_OS2</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Init_FreeType">FT_Init_FreeType</a></td><td><a href="ft2-system_interface.html#FT_Stream">FT_Stream</a></td><td><a href="ft2-truetype_tables.html#TT_PCLT">TT_PCLT</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Int">FT_Int</a></td><td><a href="ft2-system_interface.html#FT_Stream_CloseFunc">FT_Stream_CloseFunc</a></td><td><a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_ADOBE</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Int16">FT_Int16</a></td><td><a href="ft2-system_interface.html#FT_Stream_IoFunc">FT_Stream_IoFunc</a></td><td><a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_APPLE_UNICODE</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Int32">FT_Int32</a></td><td><a href="ft2-bzip2.html#FT_Stream_OpenBzip2">FT_Stream_OpenBzip2</a></td><td><a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_CUSTOM</a></td></tr>
+<tr><td><a href="ft2-basic_types.html#FT_Int64">FT_Int64</a></td><td><a href="ft2-gzip.html#FT_Stream_OpenGzip">FT_Stream_OpenGzip</a></td><td><a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_ISO</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_IS_CID_KEYED">FT_IS_CID_KEYED</a></td><td><a href="ft2-lzw.html#FT_Stream_OpenLZW">FT_Stream_OpenLZW</a></td><td><a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_MACINTOSH</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_IS_FIXED_WIDTH">FT_IS_FIXED_WIDTH</a></td><td><a href="ft2-system_interface.html#FT_StreamDesc">FT_StreamDesc</a></td><td><a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_MICROSOFT</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_IS_NAMED_INSTANCE">FT_IS_NAMED_INSTANCE</a></td><td><a href="ft2-system_interface.html#FT_StreamRec">FT_StreamRec</a></td><td><a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_XXX</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_IS_SCALABLE">FT_IS_SCALABLE</a></td><td><a href="ft2-basic_types.html#FT_String">FT_String</a></td><td><a href="ft2-truetype_tables.html#TT_Postscript">TT_Postscript</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_IS_SFNT">FT_IS_SFNT</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker">FT_Stroker</a></td><td><a href="ft2-truetype_tables.html#TT_UCR_XXX">TT_UCR_XXX</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_IS_TRICKY">FT_IS_TRICKY</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_BeginSubPath">FT_Stroker_BeginSubPath</a></td><td><a href="ft2-truetype_tables.html#TT_VertHeader">TT_VertHeader</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_IS_VARIATION">FT_IS_VARIATION</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_ConicTo">FT_Stroker_ConicTo</a></td><td><a href="ft2-properties.html#warping">warping</a></td></tr>
+<tr><td><a href="ft2-base_interface.html#FT_Kerning_Mode">FT_KERNING_DEFAULT</a></td><td><a href="ft2-glyph_stroker.html#FT_Stroker_CubicTo">FT_Stroker_CubicTo</a></td><td></td></tr>
 </table>
 <hr>
 <table class="index-toc-link"><tr><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
 
-<div class="timestamp">generated on Sat May 13 12:45:59 2017</div></body>
+<div class="timestamp">generated on Mon Jan  8 12:30:20 2018</div></body>
 </html>
index c82fec4..98e8a2c 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="lcd_filtering">LCD Filtering</h1>
 <h2>Synopsis</h2>
 <table class="synopsis">
 <tr><td><a href="#FT_LcdFilter">FT_LcdFilter</a></td><td><a href="#FT_Library_SetLcdFilterWeights">FT_Library_SetLcdFilterWeights</a></td></tr>
-<tr><td><a href="#FT_Library_SetLcdFilter">FT_Library_SetLcdFilter</a></td><td><a href="#FT_PARAM_TAG_LCD_FILTER_WEIGHTS">FT_PARAM_TAG_LCD_FILTER_WEIGHTS</a></td></tr>
+<tr><td><a href="#FT_Library_SetLcdFilter">FT_Library_SetLcdFilter</a></td><td></td></tr>
 </table>
 
 
-<p>Subpixel rendering exploits the color-striped structure of LCD pixels, increasing the available resolution in the direction of the stripe (usually horizontal RGB) by a factor of&nbsp;3. Since these subpixels are color pixels, using them unfiltered creates severe color fringes. Use the <a href="ft2-lcd_filtering.html#FT_Library_SetLcdFilter">FT_Library_SetLcdFilter</a> API to specify a low-pass filter, which is then applied to subpixel-rendered bitmaps generated through <a href="ft2-base_interface.html#FT_Render_Glyph">FT_Render_Glyph</a>. The filter sacrifices some of the higher resolution to reduce color fringes, making the glyph image slightly blurrier. Positional improvements will remain.</p>
-<p>Note that no filter is active by default, and that this function is <b>not</b> implemented in default builds of the library. You need to #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your &lsquo;ftoption.h&rsquo; file in order to activate it and explicitly call <a href="ft2-lcd_filtering.html#FT_Library_SetLcdFilter">FT_Library_SetLcdFilter</a> to enable it.</p>
+<p>Should you #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your &lsquo;ftoption.h&rsquo;, which enables patented ClearType-style rendering, the LCD-optimized glyph bitmaps should be filtered to reduce color fringes inherent to this technology. The default FreeType LCD rendering uses different technology, and API described below, although available, does nothing.</p>
+<p>ClearType-style LCD rendering exploits the color-striped structure of LCD pixels, increasing the available resolution in the direction of the stripe (usually horizontal RGB) by a factor of&nbsp;3. Since these subpixels are color pixels, using them unfiltered creates severe color fringes. Use the <a href="ft2-lcd_filtering.html#FT_Library_SetLcdFilter">FT_Library_SetLcdFilter</a> API to specify a low-pass filter, which is then applied to subpixel-rendered bitmaps generated through <a href="ft2-base_interface.html#FT_Render_Glyph">FT_Render_Glyph</a>. The filter sacrifices some of the higher resolution to reduce color fringes, making the glyph image slightly blurrier. Positional improvements will remain.</p>
 <p>A filter should have two properties:</p>
 <p>1) It should be normalized, meaning the sum of the 5&nbsp;components should be 256 (0x100). It is possible to go above or under this target sum, however: going under means tossing out contrast, going over means invoking clamping and thereby non-linearities that increase contrast somewhat at the expense of greater distortion and color-fringing. Contrast is better enhanced through stem darkening.</p>
 <p>2) It should be color-balanced, meaning a filter &lsquo;{&nbsp;a, b, c, b, a&nbsp;}&rsquo; where a&nbsp;+ b&nbsp;=&nbsp;c. It distributes the computed coverage for one subpixel to all subpixels equally, sacrificing some won resolution but drastically reducing color-fringing. Positioning improvements remain! Note that color-fringing can only really be minimized when using a color-balanced filter and alpha-blending the glyph onto a surface in linear space; see <a href="ft2-base_interface.html#FT_Render_Glyph">FT_Render_Glyph</a>.</p>
   FT_EXPORT( <a href="ft2-basic_types.html#FT_Error">FT_Error</a> )
   <b>FT_Library_SetLcdFilterWeights</b>( <a href="ft2-base_interface.html#FT_Library">FT_Library</a>      library,
                                   <span class="keyword">unsigned</span> <span class="keyword">char</span>  *weights );
+
+
+  /*
+   * @type:
+   *   FT_LcdFiveTapFilter
+   *
+   * @description:
+   *   A <span class="keyword">typedef</span> for passing the five LCD filter weights to
+   *   @<a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a> within an @<a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> structure.
+   *
+   * @since:
+   *   2.8
+   *
+   */
+#define FT_LCD_FILTER_FIVE_TAPS  5
+
+  <span class="keyword">typedef</span> <a href="ft2-basic_types.html#FT_Byte">FT_Byte</a>  FT_LcdFiveTapFilter[FT_LCD_FILTER_FIVE_TAPS];
 </pre>
 
 <p>This function can be used to enable LCD filter with custom weights, instead of using presets in <a href="ft2-lcd_filtering.html#FT_Library_SetLcdFilter">FT_Library_SetLcdFilter</a>.</p>
 
 <h4>note</h4>
 <p>Due to <b>PATENTS</b> covering subpixel rendering, this function doesn't do anything except returning &lsquo;FT_Err_Unimplemented_Feature&rsquo; 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.</p>
-<p>LCD filter weights can also be set per face using <a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a> with <a href="ft2-lcd_filtering.html#FT_PARAM_TAG_LCD_FILTER_WEIGHTS">FT_PARAM_TAG_LCD_FILTER_WEIGHTS</a>.</p>
+<p>LCD filter weights can also be set per face using <a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a> with <a href="ft2-parameter_tags.html#FT_PARAM_TAG_LCD_FILTER_WEIGHTS">FT_PARAM_TAG_LCD_FILTER_WEIGHTS</a>.</p>
 
 <h4>since</h4>
 <p>2.4.0</p>
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
-<div class="section">
-<h3 id="FT_PARAM_TAG_LCD_FILTER_WEIGHTS">FT_PARAM_TAG_LCD_FILTER_WEIGHTS</h3>
-<p>Defined in FT_LCD_FILTER_H (freetype/ftlcdfil.h).</p>
-<pre>
-#define <b>FT_PARAM_TAG_LCD_FILTER_WEIGHTS</b> \
-          <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 'l', 'c', 'd', 'f' )
-
-
-  /*
-   * @type:
-   *   FT_LcdFiveTapFilter
-   *
-   * @description:
-   *   A <span class="keyword">typedef</span> for passing the five LCD filter weights to
-   *   @<a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a> within an @<a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> structure.
-   *
-   */
-#define FT_LCD_FILTER_FIVE_TAPS  5
-
-  <span class="keyword">typedef</span> <a href="ft2-basic_types.html#FT_Byte">FT_Byte</a>  FT_LcdFiveTapFilter[FT_LCD_FILTER_FIVE_TAPS];
-</pre>
-
-<p>An <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> tag to be used with <a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a>. The corresponding argument specifies the five LCD filter weights for a given face (if using <a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_LCD</a>, for example), overriding the global default values or the values set up with <a href="ft2-lcd_filtering.html#FT_Library_SetLcdFilterWeights">FT_Library_SetLcdFilterWeights</a>.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
 </body>
 </html>
index 35a7a93..72beabc 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="list_processing">List Processing</h1>
 <h2>Synopsis</h2>
index 1bf99d8..f8f735c 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="lzw">LZW Streams</h1>
 <h2>Synopsis</h2>
index b669c68..a9b9fb3 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="mac_specific">Mac Specific Interface</h1>
 <h2>Synopsis</h2>
index ec16f12..9d1293f 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="module_management">Module Management</h1>
 <h2>Synopsis</h2>
 <p>The module name.</p>
 </td></tr>
 <tr><td class="val" id="property_name">property_name</td><td class="desc">
-<p>The property name. Properties are described in the &lsquo;Synopsis&rsquo; subsection of the module's documentation.</p>
+<p>The property name. Properties are described in section &lsquo;<a href="ft2-properties.html#properties">Driver properties</a>&rsquo;.</p>
 <p>Note that only a few modules have properties.</p>
 </td></tr>
 <tr><td class="val" id="value">value</td><td class="desc">
-<p>A generic pointer to a variable or structure that gives the new value of the property. The exact definition of &lsquo;value&rsquo; is dependent on the property; see the &lsquo;Synopsis&rsquo; subsection of the module's documentation.</p>
+<p>A generic pointer to a variable or structure that gives the new value of the property. The exact definition of &lsquo;value&rsquo; is dependent on the property; see section &lsquo;<a href="ft2-properties.html#properties">Driver properties</a>&rsquo;.</p>
 </td></tr>
 </table>
 
 <p>The module name.</p>
 </td></tr>
 <tr><td class="val" id="property_name">property_name</td><td class="desc">
-<p>The property name. Properties are described in the &lsquo;Synopsis&rsquo; subsection of the module's documentation.</p>
+<p>The property name. Properties are described in section &lsquo;<a href="ft2-properties.html#properties">Driver properties</a>&rsquo;.</p>
 </td></tr>
 </table>
 
 <h4>inout</h4>
 <table class="fields">
 <tr><td class="val" id="value">value</td><td class="desc">
-<p>A generic pointer to a variable or structure that gives the value of the property. The exact definition of &lsquo;value&rsquo; is dependent on the property; see the &lsquo;Synopsis&rsquo; subsection of the module's documentation.</p>
+<p>A generic pointer to a variable or structure that gives the value of the property. The exact definition of &lsquo;value&rsquo; is dependent on the property; see section &lsquo;<a href="ft2-properties.html#properties">Driver properties</a>&rsquo;.</p>
 </td></tr>
 </table>
 
   <b>FT_Set_Default_Properties</b>( <a href="ft2-base_interface.html#FT_Library">FT_Library</a>  library );
 </pre>
 
-<p>If compilation option FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES is set, this function reads the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable to control driver properties. See sections &lsquo;<a href="ft2-auto_hinter.html#auto_hinter">The auto-hinter</a>&rsquo;, &lsquo;<a href="ft2-cff_driver.html#cff_driver">The CFF driver</a>&rsquo;, &lsquo;<a href="ft2-pcf_driver.html#pcf_driver">The PCF driver</a>&rsquo;, and &lsquo;<a href="ft2-tt_driver.html#tt_driver">The TrueType driver</a>&rsquo; for more.</p>
+<p>If compilation option FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES is set, this function reads the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable to control driver properties. See section &lsquo;<a href="ft2-properties.html#properties">Driver properties</a>&rsquo; for more.</p>
 <p>If the compilation option is not set, this function does nothing.</p>
 <p>&lsquo;FREETYPE_PROPERTIES&rsquo; has the following syntax form (broken here into multiple lines for better readability).</p>
 <pre class="colored">
   &lt;optional whitespace&gt;
+  &lt;module-name1&gt; ':'
+  &lt;property-name1&gt; '=' &lt;property-value1&gt;
+  &lt;whitespace&gt;
+  &lt;module-name2&gt; ':'
+  &lt;property-name2&gt; '=' &lt;property-value2&gt;
+  ...
 </pre>
-
-<h4>module-name1</h4>
-<p>':'</p>
-
-<h4>property-name1</h4>
-<p>'=' &lt;property-value1&gt;</p>
-
-<h4>module-name2</h4>
-<p>':'</p>
-
-<h4>property-name2</h4>
-<p>'=' &lt;property-value2&gt; ... }</p>
 <p>Example:</p>
 <pre class="colored">
   FREETYPE_PROPERTIES=truetype:interpreter-version=35 \
 </td></tr>
 </table>
 
+<h4>since</h4>
+<p>2.8</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
index 2a69f91..6b51b53 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="multiple_masters">Multiple Masters</h1>
 <h2>Synopsis</h2>
 <table class="synopsis">
-<tr><td><a href="#FT_MM_Axis">FT_MM_Axis</a></td><td><a href="#FT_Set_MM_Design_Coordinates">FT_Set_MM_Design_Coordinates</a></td></tr>
-<tr><td><a href="#FT_Multi_Master">FT_Multi_Master</a></td><td><a href="#FT_Set_Var_Design_Coordinates">FT_Set_Var_Design_Coordinates</a></td></tr>
-<tr><td><a href="#FT_Var_Axis">FT_Var_Axis</a></td><td><a href="#FT_Get_Var_Design_Coordinates">FT_Get_Var_Design_Coordinates</a></td></tr>
-<tr><td><a href="#FT_Var_Named_Style">FT_Var_Named_Style</a></td><td><a href="#FT_Set_MM_Blend_Coordinates">FT_Set_MM_Blend_Coordinates</a></td></tr>
-<tr><td><a href="#FT_MM_Var">FT_MM_Var</a></td><td><a href="#FT_Get_MM_Blend_Coordinates">FT_Get_MM_Blend_Coordinates</a></td></tr>
-<tr><td><a href="#FT_Get_Multi_Master">FT_Get_Multi_Master</a></td><td><a href="#FT_Set_Var_Blend_Coordinates">FT_Set_Var_Blend_Coordinates</a></td></tr>
-<tr><td><a href="#FT_Get_MM_Var">FT_Get_MM_Var</a></td><td><a href="#FT_Get_Var_Blend_Coordinates">FT_Get_Var_Blend_Coordinates</a></td></tr>
+<tr><td><a href="#FT_MM_Axis">FT_MM_Axis</a></td><td><a href="#FT_Set_Var_Design_Coordinates">FT_Set_Var_Design_Coordinates</a></td></tr>
+<tr><td><a href="#FT_Multi_Master">FT_Multi_Master</a></td><td><a href="#FT_Get_Var_Design_Coordinates">FT_Get_Var_Design_Coordinates</a></td></tr>
+<tr><td><a href="#FT_Var_Axis">FT_Var_Axis</a></td><td><a href="#FT_Set_MM_Blend_Coordinates">FT_Set_MM_Blend_Coordinates</a></td></tr>
+<tr><td><a href="#FT_Var_Named_Style">FT_Var_Named_Style</a></td><td><a href="#FT_Get_MM_Blend_Coordinates">FT_Get_MM_Blend_Coordinates</a></td></tr>
+<tr><td><a href="#FT_MM_Var">FT_MM_Var</a></td><td><a href="#FT_Set_Var_Blend_Coordinates">FT_Set_Var_Blend_Coordinates</a></td></tr>
+<tr><td><a href="#FT_Get_Multi_Master">FT_Get_Multi_Master</a></td><td><a href="#FT_Get_Var_Blend_Coordinates">FT_Get_Var_Blend_Coordinates</a></td></tr>
+<tr><td><a href="#FT_Get_MM_Var">FT_Get_MM_Var</a></td><td><a href="#FT_VAR_AXIS_FLAG_XXX">FT_VAR_AXIS_FLAG_XXX</a></td></tr>
+<tr><td><a href="#FT_Done_MM_Var">FT_Done_MM_Var</a></td><td><a href="#FT_Get_Var_Axis_Flags">FT_Get_Var_Axis_Flags</a></td></tr>
+<tr><td><a href="#FT_Set_MM_Design_Coordinates">FT_Set_MM_Design_Coordinates</a></td><td><a href="#FT_Set_Named_Instance">FT_Set_Named_Instance</a></td></tr>
 </table>
 
 
 <p>The entry in &lsquo;name&rsquo; table identifying this instance.</p>
 </td></tr>
 <tr><td class="val" id="psid">psid</td><td class="desc">
-<p>The entry in &lsquo;name&rsquo; table identifying a PostScript name for this instance.</p>
+<p>The entry in &lsquo;name&rsquo; table identifying a PostScript name for this instance. Value 0xFFFF indicates a missing entry.</p>
 </td></tr>
 </table>
 
   } <b>FT_MM_Var</b>;
 </pre>
 
-<p>A structure to model the axes and space of a Adobe MM, TrueType GX, or OpenType variation font.</p>
+<p>A structure to model the axes and space of an Adobe MM, TrueType GX, or OpenType variation font.</p>
 <p>Some fields are specific to one format and not to the others.</p>
 
 <h4>fields</h4>
 <h4>output</h4>
 <table class="fields">
 <tr><td class="val" id="amaster">amaster</td><td class="desc">
-<p>The variation descriptor. Allocates a data structure, which the user must deallocate with &lsquo;free&rsquo; after use.</p>
+<p>The variation descriptor. Allocates a data structure, which the user must deallocate with a call to <a href="ft2-multiple_masters.html#FT_Done_MM_Var">FT_Done_MM_Var</a> after use.</p>
+</td></tr>
+</table>
+
+<h4>return</h4>
+<p>FreeType error code. 0&nbsp;means success.</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="FT_Done_MM_Var">FT_Done_MM_Var</h3>
+<p>Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h).</p>
+<pre>
+  FT_EXPORT( <a href="ft2-basic_types.html#FT_Error">FT_Error</a> )
+  <b>FT_Done_MM_Var</b>( <a href="ft2-base_interface.html#FT_Library">FT_Library</a>   library,
+                  <a href="ft2-multiple_masters.html#FT_MM_Var">FT_MM_Var</a>   *amaster );
+</pre>
+
+<p>Free the memory allocated by <a href="ft2-multiple_masters.html#FT_Get_MM_Var">FT_Get_MM_Var</a>.</p>
+
+<h4>input</h4>
+<table class="fields">
+<tr><td class="val" id="library">library</td><td class="desc">
+<p>A handle of the face's parent library object that was used in the call to <a href="ft2-multiple_masters.html#FT_Get_MM_Var">FT_Get_MM_Var</a> to create &lsquo;amaster&rsquo;.</p>
 </td></tr>
 </table>
 
 <h4>return</h4>
 <p>FreeType error code. 0&nbsp;means success.</p>
 
+<h4>note</h4>
+<p>[Since 2.8.1] To reset all axes to the default values, call the function with &lsquo;num_coords&rsquo; set to zero and &lsquo;coords&rsquo; set to NULL.</p>
+<p>[Since 2.9] If &lsquo;num_coords&rsquo; is larger than zero, this function sets the <a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_VARIATION</a> bit in <a href="ft2-base_interface.html#FT_Face">FT_Face</a>'s &lsquo;face_flags&rsquo; field (i.e., <a href="ft2-base_interface.html#FT_IS_VARIATION">FT_IS_VARIATION</a> will return true). If &lsquo;num_coords&rsquo; is zero, this bit flag gets unset.</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 <h4>return</h4>
 <p>FreeType error code. 0&nbsp;means success.</p>
 
+<h4>note</h4>
+<p>[Since 2.8.1] To reset all axes to the default values, call the function with &lsquo;num_coords&rsquo; set to zero and &lsquo;coords&rsquo; set to NULL. [Since 2.9] &lsquo;Default values&rsquo; means the currently selected named instance (or the base font if no named instance is selected).</p>
+<p>[Since 2.9] If &lsquo;num_coords&rsquo; is larger than zero, this function sets the <a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_VARIATION</a> bit in <a href="ft2-base_interface.html#FT_Face">FT_Face</a>'s &lsquo;face_flags&rsquo; field (i.e., <a href="ft2-base_interface.html#FT_IS_VARIATION">FT_IS_VARIATION</a> will return true). If &lsquo;num_coords&rsquo; is zero, this bit flag gets unset.</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 <h4>return</h4>
 <p>FreeType error code. 0&nbsp;means success.</p>
 
+<h4>since</h4>
+<p>2.7.1</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 <h4>return</h4>
 <p>FreeType error code. 0&nbsp;means success.</p>
 
+<h4>note</h4>
+<p>[Since 2.8.1] To reset all axes to the default values, call the function with &lsquo;num_coords&rsquo; set to zero and &lsquo;coords&rsquo; set to NULL. [Since 2.9] &lsquo;Default values&rsquo; means the currently selected named instance (or the base font if no named instance is selected).</p>
+<p>[Since 2.9] If &lsquo;num_coords&rsquo; is larger than zero, this function sets the <a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_VARIATION</a> bit in <a href="ft2-base_interface.html#FT_Face">FT_Face</a>'s &lsquo;face_flags&rsquo; field (i.e., <a href="ft2-base_interface.html#FT_IS_VARIATION">FT_IS_VARIATION</a> will return true). If &lsquo;num_coords&rsquo; is zero, this bit flag gets unset.</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 <h4>return</h4>
 <p>FreeType error code. 0&nbsp;means success.</p>
 
+<h4>since</h4>
+<p>2.7.1</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 
 <p>This is another name of <a href="ft2-multiple_masters.html#FT_Get_MM_Blend_Coordinates">FT_Get_MM_Blend_Coordinates</a>.</p>
 
+<h4>since</h4>
+<p>2.7.1</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="FT_VAR_AXIS_FLAG_XXX">FT_VAR_AXIS_FLAG_XXX</h3>
+<p>Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h).</p>
+<pre>
+#define <a href="ft2-multiple_masters.html#FT_VAR_AXIS_FLAG_HIDDEN">FT_VAR_AXIS_FLAG_HIDDEN</a>  1
+</pre>
+
+<p>A list of bit flags used in the return value of <a href="ft2-multiple_masters.html#FT_Get_Var_Axis_Flags">FT_Get_Var_Axis_Flags</a>.</p>
+
+<h4>values</h4>
+<table class="fields">
+<tr><td class="val" id="FT_VAR_AXIS_FLAG_HIDDEN">FT_VAR_AXIS_FLAG_HIDDEN</td><td class="desc">
+<p>The variation axis should not be exposed to user interfaces.</p>
+</td></tr>
+</table>
+
+<h4>since</h4>
+<p>2.8.1</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="FT_Get_Var_Axis_Flags">FT_Get_Var_Axis_Flags</h3>
+<p>Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h).</p>
+<pre>
+  FT_EXPORT( <a href="ft2-basic_types.html#FT_Error">FT_Error</a> )
+  <b>FT_Get_Var_Axis_Flags</b>( <a href="ft2-multiple_masters.html#FT_MM_Var">FT_MM_Var</a>*  master,
+                         <a href="ft2-basic_types.html#FT_UInt">FT_UInt</a>     axis_index,
+                         <a href="ft2-basic_types.html#FT_UInt">FT_UInt</a>*    flags );
+</pre>
+
+<p>Get the &lsquo;flags&rsquo; field of an OpenType Variation Axis Record.</p>
+<p>Not meaningful for Adobe MM fonts (&lsquo;*flags&rsquo; is always zero).</p>
+
+<h4>input</h4>
+<table class="fields">
+<tr><td class="val" id="master">master</td><td class="desc">
+<p>The variation descriptor.</p>
+</td></tr>
+<tr><td class="val" id="axis_index">axis_index</td><td class="desc">
+<p>The index of the requested variation axis.</p>
+</td></tr>
+</table>
+
+<h4>output</h4>
+<table class="fields">
+<tr><td class="val" id="flags">flags</td><td class="desc">
+<p>The &lsquo;flags&rsquo; field. See <a href="ft2-multiple_masters.html#FT_VAR_AXIS_FLAG_XXX">FT_VAR_AXIS_FLAG_XXX</a> for possible values.</p>
+</td></tr>
+</table>
+
+<h4>return</h4>
+<p>FreeType error code. 0&nbsp;means success.</p>
+
+<h4>since</h4>
+<p>2.8.1</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="FT_Set_Named_Instance">FT_Set_Named_Instance</h3>
+<p>Defined in FT_MULTIPLE_MASTERS_H (freetype/ftmm.h).</p>
+<pre>
+  FT_EXPORT( <a href="ft2-basic_types.html#FT_Error">FT_Error</a> )
+  <b>FT_Set_Named_Instance</b>( <a href="ft2-base_interface.html#FT_Face">FT_Face</a>  face,
+                         <a href="ft2-basic_types.html#FT_UInt">FT_UInt</a>  instance_index );
+</pre>
+
+<p>Set or change the current named instance.</p>
+
+<h4>input</h4>
+<table class="fields">
+<tr><td class="val" id="face">face</td><td class="desc">
+<p>A handle to the source face.</p>
+</td></tr>
+<tr><td class="val" id="instance_index">instance_index</td><td class="desc">
+<p>The index of the requested instance, starting with value 1. If set to value 0, FreeType switches to font access without a named instance.</p>
+</td></tr>
+</table>
+
+<h4>return</h4>
+<p>FreeType error code. 0&nbsp;means success.</p>
+
+<h4>note</h4>
+<p>The function uses the value of &lsquo;instance_index&rsquo; to set bits 16-30 of the face's &lsquo;face_index&rsquo; field. It also resets any variation applied to the font, and the <a href="ft2-base_interface.html#FT_FACE_FLAG_XXX">FT_FACE_FLAG_VARIATION</a> bit of the face's &lsquo;face_flags&rsquo; field gets reset to zero (i.e., <a href="ft2-base_interface.html#FT_IS_VARIATION">FT_IS_VARIATION</a> will return false).</p>
+<p>For Adobe MM fonts (which don't have named instances) this function simply resets the current face to the default instance.</p>
+
+<h4>since</h4>
+<p>2.9</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
index d1e4f92..52991ce 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="ot_validation">OpenType Validation</h1>
 <h2>Synopsis</h2>
index 8b9dc3d..2192129 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="outline_processing">Outline Processing</h1>
 <h2>Synopsis</h2>
 </td></tr>
 <tr><td class="val" id="tags">tags</td><td class="desc">
 <p>A pointer to an array of &lsquo;n_points&rsquo; chars, giving each outline point's type.</p>
-<p>If bit&nbsp;0 is unset, the point is &lsquo;off&rsquo; the curve, i.e., a Bézier control point, while it is &lsquo;on&rsquo; if set.</p>
-<p>Bit&nbsp;1 is meaningful for &lsquo;off&rsquo; points only. If set, it indicates a third-order Bézier arc control point; and a second-order control point if unset.</p>
+<p>If bit&nbsp;0 is unset, the point is &lsquo;off&rsquo; the curve, i.e., a Bezier control point, while it is &lsquo;on&rsquo; if set.</p>
+<p>Bit&nbsp;1 is meaningful for &lsquo;off&rsquo; points only. If set, it indicates a third-order Bezier arc control point; and a second-order control point if unset.</p>
 <p>If bit&nbsp;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).</p>
 <p>Bits 3 and&nbsp;4 are reserved for internal purposes.</p>
 </td></tr>
 
 <h4>note</h4>
 <p>If the outline's &lsquo;owner&rsquo; field is not set, only the outline descriptor will be released.</p>
-<p>The reason why this function takes an &lsquo;library&rsquo; parameter is simply to use ft_mem_free().</p>
 
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 <p>Embolden an outline. The new outline will be &lsquo;xstrength&rsquo; pixels wider and &lsquo;ystrength&rsquo; pixels higher. Otherwise, it is similar to <a href="ft2-outline_processing.html#FT_Outline_Embolden">FT_Outline_Embolden</a>, which uses the same strength in both directions.</p>
 
+<h4>since</h4>
+<p>2.4.10</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
                        <a href="ft2-basic_types.html#FT_BBox">FT_BBox</a>           *acbox );
 </pre>
 
-<p>Return an outline's &lsquo;control box&rsquo;. 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 that contains Bézier outside arcs).</p>
+<p>Return an outline's &lsquo;control box&rsquo;. The control box encloses all the outline's points, including Bezier 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 that contains Bezier outside arcs).</p>
 <p>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 &lsquo;ftbbox&rsquo; component, which is dedicated to this single task.</p>
 
 <h4>input</h4>
                        <a href="ft2-basic_types.html#FT_BBox">FT_BBox</a>     *abbox );
 </pre>
 
-<p>Compute the exact bounding box of an outline. This is slower than computing the control box. However, it uses an advanced algorithm that returns <i>very</i> quickly when the two boxes coincide. Otherwise, the outline Bézier arcs are traversed to extract their extrema.</p>
+<p>Compute the exact bounding box of an outline. This is slower than computing the control box. However, it uses an advanced algorithm that returns <i>very</i> quickly when the two boxes coincide. Otherwise, the outline Bezier arcs are traversed to extract their extrema.</p>
 
 <h4>input</h4>
 <table class="fields">
                         <span class="keyword">void</span>*                    user );
 </pre>
 
-<p>Walk over an outline's structure to decompose it into individual segments and Bézier arcs. This function also emits &lsquo;move to&rsquo; operations to indicate the start of new contours in the outline.</p>
+<p>Walk over an outline's structure to decompose it into individual segments and Bezier arcs. This function also emits &lsquo;move to&rsquo; operations to indicate the start of new contours in the outline.</p>
 
 <h4>input</h4>
 <table class="fields">
   } <b>FT_Outline_Funcs</b>;
 </pre>
 
-<p>A structure to hold various function pointers used during outline decomposition in order to emit segments, conic, and cubic Béziers.</p>
+<p>A structure to hold various function pointers used during outline decomposition in order to emit segments, conic, and cubic Beziers.</p>
 
 <h4>fields</h4>
 <table class="fields">
 <p>The segment emitter.</p>
 </td></tr>
 <tr><td class="val" id="conic_to">conic_to</td><td class="desc">
-<p>The second-order Bézier arc emitter.</p>
+<p>The second-order Bezier arc emitter.</p>
 </td></tr>
 <tr><td class="val" id="cubic_to">cubic_to</td><td class="desc">
-<p>The third-order Bézier arc emitter.</p>
+<p>The third-order Bezier arc emitter.</p>
 </td></tr>
 <tr><td class="val" id="shift">shift</td><td class="desc">
 <p>The shift that is applied to coordinates before they are sent to the emitter.</p>
 </pre>
 
 <p>A function pointer type used to describe the signature of a &lsquo;conic to&rsquo; function during outline walking or decomposition.</p>
-<p>A &lsquo;conic to&rsquo; is emitted to indicate a second-order Bézier arc in the outline.</p>
+<p>A &lsquo;conic to&rsquo; is emitted to indicate a second-order Bezier arc in the outline.</p>
 
 <h4>input</h4>
 <table class="fields">
 </pre>
 
 <p>A function pointer type used to describe the signature of a &lsquo;cubic to&rsquo; function during outline walking or decomposition.</p>
-<p>A &lsquo;cubic to&rsquo; is emitted to indicate a third-order Bézier arc.</p>
+<p>A &lsquo;cubic to&rsquo; is emitted to indicate a third-order Bezier arc.</p>
 
 <h4>input</h4>
 <table class="fields">
 <tr><td class="val" id="control1">control1</td><td class="desc">
-<p>A pointer to the first Bézier control point.</p>
+<p>A pointer to the first Bezier control point.</p>
 </td></tr>
 <tr><td class="val" id="control2">control2</td><td class="desc">
-<p>A pointer to the second Bézier control point.</p>
+<p>A pointer to the second Bezier control point.</p>
 </td></tr>
 <tr><td class="val" id="to">to</td><td class="desc">
 <p>A pointer to the target end point.</p>
diff --git a/docs/reference/ft2-parameter_tags.html b/docs/reference/ft2-parameter_tags.html
new file mode 100644 (file)
index 0000000..6178d03
--- /dev/null
@@ -0,0 +1,232 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+"https://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>FreeType-2.9 API Reference</title>
+<style type="text/css">
+  a:link { color: #0000EF; }
+  a:visited { color: #51188E; }
+  a:hover { color: #FF0000; }
+
+  body { font-family: Verdana, Geneva, Arial, Helvetica, serif;
+         color: #000000;
+         background: #FFFFFF;
+         width: 87%;
+         margin: auto; }
+
+  div.section { width: 75%;
+                margin: auto; }
+  div.section hr { margin: 4ex 0 1ex 0; }
+  div.section h4 { background-color: #EEEEFF;
+                   font-size: medium;
+                   font-style: oblique;
+                   font-weight: bold;
+                   margin: 3ex 0 1.5ex 9%;
+                   padding: 0.3ex 0 0.3ex 1%; }
+  div.section p { margin: 1.5ex 0 1.5ex 10%; }
+  div.section pre { margin: 3ex 0 3ex 9%;
+                    background-color: #D6E8FF;
+                    padding: 2ex 0 2ex 1%; }
+  div.section table.fields { width: 90%;
+                             margin: 1.5ex 0 1.5ex 10%; }
+  div.section table.toc { width: 95%;
+                          margin: 1.5ex 0 1.5ex 5%; }
+  div.timestamp { text-align: center;
+                  font-size: 69%;
+                  margin: 1.5ex 0 1.5ex 0; }
+
+  h1 { text-align: center; }
+  h3 { font-size: medium;
+       margin: 4ex 0 1.5ex 0; }
+
+  p { text-align: justify; }
+
+  pre.colored { color: blue; }
+
+  span.keyword { font-family: monospace;
+                 text-align: left;
+                 white-space: pre;
+                 color: darkblue; }
+
+  table.fields td.val { font-weight: bold;
+                        text-align: right;
+                        width: 30%;
+                        vertical-align: baseline;
+                        padding: 1ex 1em 1ex 0; }
+  table.fields td.desc { vertical-align: baseline;
+                         padding: 1ex 0 1ex 1em; }
+  table.fields td.desc p:first-child { margin: 0; }
+  table.fields td.desc p { margin: 1.5ex 0 0 0; }
+  table.index { margin: 6ex auto 6ex auto;
+                border: 0;
+                border-collapse: separate;
+                border-spacing: 1em 0.3ex; }
+  table.index tr { padding: 0; }
+  table.index td { padding: 0; }
+  table.index-toc-link { width: 100%;
+                         border: 0;
+                         border-spacing: 0;
+                         margin: 1ex 0 1ex 0; }
+  table.index-toc-link td.left { padding: 0 0.5em 0 0.5em;
+                                 font-size: 83%;
+                                 text-align: left; }
+  table.index-toc-link td.middle { padding: 0 0.5em 0 0.5em;
+                                   font-size: 83%;
+                                   text-align: center; }
+  table.index-toc-link td.right { padding: 0 0.5em 0 0.5em;
+                                  font-size: 83%;
+                                  text-align: right; }
+  table.synopsis { margin: 6ex auto 6ex auto;
+                   border: 0;
+                   border-collapse: separate;
+                   border-spacing: 2em 0.6ex; }
+  table.synopsis tr { padding: 0; }
+  table.synopsis td { padding: 0; }
+  table.toc td.link { width: 30%;
+                      text-align: right;
+                      vertical-align: baseline;
+                      padding: 1ex 1em 1ex 0; }
+  table.toc td.desc { vertical-align: baseline;
+                      padding: 1ex 0 1ex 1em;
+                      text-align: left; }
+  table.toc td.desc p:first-child { margin: 0;
+                                    text-align: left; }
+  table.toc td.desc p { margin: 1.5ex 0 0 0;
+                        text-align: left; }
+
+</style>
+</head>
+<body>
+
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
+<h1>FreeType-2.9 API Reference</h1>
+
+<h1 id="parameter_tags">Parameter Tags</h1>
+<h2>Synopsis</h2>
+<table class="synopsis">
+<tr><td><a href="#FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY">FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY</a></td></tr>
+<tr><td><a href="#FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY">FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY</a></td></tr>
+<tr><td><a href="#FT_PARAM_TAG_INCREMENTAL">FT_PARAM_TAG_INCREMENTAL</a></td></tr>
+<tr><td><a href="#FT_PARAM_TAG_LCD_FILTER_WEIGHTS">FT_PARAM_TAG_LCD_FILTER_WEIGHTS</a></td></tr>
+<tr><td><a href="#FT_PARAM_TAG_RANDOM_SEED">FT_PARAM_TAG_RANDOM_SEED</a></td></tr>
+<tr><td><a href="#FT_PARAM_TAG_STEM_DARKENING">FT_PARAM_TAG_STEM_DARKENING</a></td></tr>
+<tr><td><a href="#FT_PARAM_TAG_UNPATENTED_HINTING">FT_PARAM_TAG_UNPATENTED_HINTING</a></td></tr>
+</table>
+
+
+<p>This section contains macros for the <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> structure that are used with various functions to activate some special functionality or different behaviour of various components of FreeType.</p>
+
+<div class="section">
+<h3 id="FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY">FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY</h3>
+<pre>
+#define <b>FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY</b> \
+          <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 'i', 'g', 'p', 'f' )
+
+
+  /* this constant is deprecated */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY \
+          <b>FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY</b>
+</pre>
+
+<p>A tag for <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> to make <a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a> ignore typographic family names in the &lsquo;name&rsquo; table (introduced in OpenType version 1.4). Use this for backward compatibility with legacy systems that have a four-faces-per-family restriction.</p>
+
+<h4>since</h4>
+<p>2.8</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY">FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY</h3>
+<pre>
+#define <b>FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY</b> \
+          <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 'i', 'g', 'p', 's' )
+
+
+  /* this constant is deprecated */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY \
+          <b>FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY</b>
+</pre>
+
+<p>A tag for <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> to make <a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a> ignore typographic subfamily names in the &lsquo;name&rsquo; table (introduced in OpenType version 1.4). Use this for backward compatibility with legacy systems that have a four-faces-per-family restriction.</p>
+
+<h4>since</h4>
+<p>2.8</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="FT_PARAM_TAG_INCREMENTAL">FT_PARAM_TAG_INCREMENTAL</h3>
+<pre>
+#define <b>FT_PARAM_TAG_INCREMENTAL</b> \
+          <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 'i', 'n', 'c', 'r' )
+</pre>
+
+<p>An <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> tag to be used with <a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a> to indicate incremental glyph loading.</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="FT_PARAM_TAG_LCD_FILTER_WEIGHTS">FT_PARAM_TAG_LCD_FILTER_WEIGHTS</h3>
+<pre>
+#define <b>FT_PARAM_TAG_LCD_FILTER_WEIGHTS</b> \
+          <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 'l', 'c', 'd', 'f' )
+</pre>
+
+<p>An <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> tag to be used with <a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a>. The corresponding argument specifies the five LCD filter weights for a given face (if using <a href="ft2-base_interface.html#FT_LOAD_TARGET_XXX">FT_LOAD_TARGET_LCD</a>, for example), overriding the global default values or the values set up with <a href="ft2-lcd_filtering.html#FT_Library_SetLcdFilterWeights">FT_Library_SetLcdFilterWeights</a>.</p>
+
+<h4>since</h4>
+<p>2.8</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="FT_PARAM_TAG_RANDOM_SEED">FT_PARAM_TAG_RANDOM_SEED</h3>
+<pre>
+#define <b>FT_PARAM_TAG_RANDOM_SEED</b> \
+          <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 's', 'e', 'e', 'd' )
+</pre>
+
+<p>An <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> tag to be used with <a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a>. The corresponding 32bit signed integer argument overrides the font driver's random seed value with a face-specific one; see <a href="ft2-properties.html#random-seed">random-seed</a>.</p>
+
+<h4>since</h4>
+<p>2.8</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="FT_PARAM_TAG_STEM_DARKENING">FT_PARAM_TAG_STEM_DARKENING</h3>
+<pre>
+#define <b>FT_PARAM_TAG_STEM_DARKENING</b> \
+          <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 'd', 'a', 'r', 'k' )
+</pre>
+
+<p>An <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> tag to be used with <a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a>. The corresponding Boolean argument specifies whether to apply stem darkening, overriding the global default values or the values set up with <a href="ft2-module_management.html#FT_Property_Set">FT_Property_Set</a> (see <a href="ft2-properties.html#no-stem-darkening">no-stem-darkening</a>).</p>
+<p>This is a passive setting that only takes effect if the font driver or autohinter honors it, which the CFF, Type&nbsp;1, and CID drivers always do, but the autohinter only in &lsquo;light&rsquo; hinting mode (as of version 2.9).</p>
+
+<h4>since</h4>
+<p>2.8</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="FT_PARAM_TAG_UNPATENTED_HINTING">FT_PARAM_TAG_UNPATENTED_HINTING</h3>
+<pre>
+#define <b>FT_PARAM_TAG_UNPATENTED_HINTING</b> \
+          <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 'u', 'n', 'p', 'a' )
+</pre>
+
+<p>Deprecated, no effect.</p>
+<p>Previously: A constant used as the tag of an <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> structure to indicate that unpatented methods only should be used by the TrueType bytecode interpreter for a typeface opened by <a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a>.</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+</body>
+</html>
index 31008bc..75d6d2a 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="pcf_driver">The PCF driver</h1>
-<h2>Synopsis</h2>
-<table class="synopsis">
-<tr><td><a href="#no-long-family-names">no-long-family-names</a></td><td></td><td></td></tr>
-</table>
 
-
-<p>While FreeType's PCF driver doesn't expose API functions by itself, it is possible to control its behaviour with <a href="ft2-module_management.html#FT_Property_Set">FT_Property_Set</a> and <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a>. Right now, there is a single property &lsquo;no-long-family-names&rsquo; available if FreeType is compiled with PCF_CONFIG_OPTION_LONG_FAMILY_NAMES.</p>
+<p>While FreeType's PCF driver doesn't expose API functions by itself, it is possible to control its behaviour with <a href="ft2-module_management.html#FT_Property_Set">FT_Property_Set</a> and <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a>. Right now, there is a single property <a href="ft2-properties.html#no-long-family-names">no-long-family-names</a> available if FreeType is compiled with PCF_CONFIG_OPTION_LONG_FAMILY_NAMES.</p>
 <p>The PCF driver's module name is &lsquo;pcf&rsquo;.</p>
 
-<div class="section">
-<h3 id="no-long-family-names">no-long-family-names</h3>
-<p>Defined in FT_PCF_DRIVER_H (freetype/ftpcfdrv.h).</p>
-<pre>
-FT_END_HEADER
-
-
-#endif /* FTPCFDRV_H_ */
-
-
-/* END */
-</pre>
-
-<p>If PCF_CONFIG_OPTION_LONG_FAMILY_NAMES is active while compiling FreeType, the PCF driver constructs long family names.</p>
-<p>There are many PCF fonts just called &lsquo;Fixed&rsquo; which look completely different, and which have nothing to do with each other. When selecting &lsquo;Fixed&rsquo; in KDE or Gnome one gets results that appear rather random, the style changes often if one changes the size and one cannot select some fonts at all. The improve this situation, the PCF module prepends the foundry name (plus a space) to the family name. It also checks whether there are &lsquo;wide&rsquo; characters; all put together, family names like &lsquo;Sony Fixed&rsquo; or &lsquo;Misc Fixed Wide&rsquo; are constructed.</p>
-<p>If &lsquo;no-long-family-names&rsquo; is set, this feature gets switched off.</p>
-<pre class="colored">
-  FT_Library  library;
-  FT_Bool     no_long_family_names = TRUE;
-
-
-  FT_Init_FreeType( &amp;library );
-
-  FT_Property_Set( library, "pcf",
-                            "no-long-family-names",
-                            &amp;no_long_family_names );
-</pre>
-
-<h4>note</h4>
-<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
-<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable (using values 1 and 0 for &lsquo;on&rsquo; and &lsquo;off&rsquo;, respectively).</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
 </body>
 </html>
index 36f2f8e..a398c50 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="pfr_fonts">PFR Fonts</h1>
 <h2>Synopsis</h2>
diff --git a/docs/reference/ft2-properties.html b/docs/reference/ft2-properties.html
new file mode 100644 (file)
index 0000000..abf5b10
--- /dev/null
@@ -0,0 +1,704 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+"https://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>FreeType-2.9 API Reference</title>
+<style type="text/css">
+  a:link { color: #0000EF; }
+  a:visited { color: #51188E; }
+  a:hover { color: #FF0000; }
+
+  body { font-family: Verdana, Geneva, Arial, Helvetica, serif;
+         color: #000000;
+         background: #FFFFFF;
+         width: 87%;
+         margin: auto; }
+
+  div.section { width: 75%;
+                margin: auto; }
+  div.section hr { margin: 4ex 0 1ex 0; }
+  div.section h4 { background-color: #EEEEFF;
+                   font-size: medium;
+                   font-style: oblique;
+                   font-weight: bold;
+                   margin: 3ex 0 1.5ex 9%;
+                   padding: 0.3ex 0 0.3ex 1%; }
+  div.section p { margin: 1.5ex 0 1.5ex 10%; }
+  div.section pre { margin: 3ex 0 3ex 9%;
+                    background-color: #D6E8FF;
+                    padding: 2ex 0 2ex 1%; }
+  div.section table.fields { width: 90%;
+                             margin: 1.5ex 0 1.5ex 10%; }
+  div.section table.toc { width: 95%;
+                          margin: 1.5ex 0 1.5ex 5%; }
+  div.timestamp { text-align: center;
+                  font-size: 69%;
+                  margin: 1.5ex 0 1.5ex 0; }
+
+  h1 { text-align: center; }
+  h3 { font-size: medium;
+       margin: 4ex 0 1.5ex 0; }
+
+  p { text-align: justify; }
+
+  pre.colored { color: blue; }
+
+  span.keyword { font-family: monospace;
+                 text-align: left;
+                 white-space: pre;
+                 color: darkblue; }
+
+  table.fields td.val { font-weight: bold;
+                        text-align: right;
+                        width: 30%;
+                        vertical-align: baseline;
+                        padding: 1ex 1em 1ex 0; }
+  table.fields td.desc { vertical-align: baseline;
+                         padding: 1ex 0 1ex 1em; }
+  table.fields td.desc p:first-child { margin: 0; }
+  table.fields td.desc p { margin: 1.5ex 0 0 0; }
+  table.index { margin: 6ex auto 6ex auto;
+                border: 0;
+                border-collapse: separate;
+                border-spacing: 1em 0.3ex; }
+  table.index tr { padding: 0; }
+  table.index td { padding: 0; }
+  table.index-toc-link { width: 100%;
+                         border: 0;
+                         border-spacing: 0;
+                         margin: 1ex 0 1ex 0; }
+  table.index-toc-link td.left { padding: 0 0.5em 0 0.5em;
+                                 font-size: 83%;
+                                 text-align: left; }
+  table.index-toc-link td.middle { padding: 0 0.5em 0 0.5em;
+                                   font-size: 83%;
+                                   text-align: center; }
+  table.index-toc-link td.right { padding: 0 0.5em 0 0.5em;
+                                  font-size: 83%;
+                                  text-align: right; }
+  table.synopsis { margin: 6ex auto 6ex auto;
+                   border: 0;
+                   border-collapse: separate;
+                   border-spacing: 2em 0.6ex; }
+  table.synopsis tr { padding: 0; }
+  table.synopsis td { padding: 0; }
+  table.toc td.link { width: 30%;
+                      text-align: right;
+                      vertical-align: baseline;
+                      padding: 1ex 1em 1ex 0; }
+  table.toc td.desc { vertical-align: baseline;
+                      padding: 1ex 0 1ex 1em;
+                      text-align: left; }
+  table.toc td.desc p:first-child { margin: 0;
+                                    text-align: left; }
+  table.toc td.desc p { margin: 1.5ex 0 0 0;
+                        text-align: left; }
+
+</style>
+</head>
+<body>
+
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
+<h1>FreeType-2.9 API Reference</h1>
+
+<h1 id="properties">Driver properties</h1>
+<h2>Synopsis</h2>
+<table class="synopsis">
+<tr><td><a href="#FT_HINTING_XXX">FT_HINTING_XXX</a></td><td><a href="#glyph-to-script-map">glyph-to-script-map</a></td></tr>
+<tr><td><a href="#hinting-engine">hinting-engine</a></td><td><a href="#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_XXX</a></td></tr>
+<tr><td><a href="#no-stem-darkening">no-stem-darkening</a></td><td><a href="#FT_Prop_GlyphToScriptMap">FT_Prop_GlyphToScriptMap</a></td></tr>
+<tr><td><a href="#darkening-parameters">darkening-parameters</a></td><td><a href="#fallback-script">fallback-script</a></td></tr>
+<tr><td><a href="#random-seed">random-seed</a></td><td><a href="#default-script">default-script</a></td></tr>
+<tr><td><a href="#no-long-family-names">no-long-family-names</a></td><td><a href="#increase-x-height">increase-x-height</a></td></tr>
+<tr><td><a href="#TT_INTERPRETER_VERSION_XXX">TT_INTERPRETER_VERSION_XXX</a></td><td><a href="#FT_Prop_IncreaseXHeight">FT_Prop_IncreaseXHeight</a></td></tr>
+<tr><td><a href="#interpreter-version">interpreter-version</a></td><td><a href="#warping">warping</a></td></tr>
+</table>
+
+
+<p>Driver modules can be controlled by setting and unsetting properties, using the functions <a href="ft2-module_management.html#FT_Property_Set">FT_Property_Set</a> and <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a>. This section documents the available properties, together with auxiliary macros and structures.</p>
+
+<div class="section">
+<h3 id="FT_HINTING_XXX">FT_HINTING_XXX</h3>
+<p>Defined in FT_DRIVER_H (freetype/ftdriver.h).</p>
+<pre>
+#define <a href="ft2-properties.html#FT_HINTING_FREETYPE">FT_HINTING_FREETYPE</a>  0
+#define <a href="ft2-properties.html#FT_HINTING_ADOBE">FT_HINTING_ADOBE</a>     1
+
+  /* these constants (introduced in 2.4.12) are deprecated */
+#define FT_CFF_HINTING_FREETYPE  <a href="ft2-properties.html#FT_HINTING_FREETYPE">FT_HINTING_FREETYPE</a>
+#define FT_CFF_HINTING_ADOBE     <a href="ft2-properties.html#FT_HINTING_ADOBE">FT_HINTING_ADOBE</a>
+</pre>
+
+<p>A list of constants used for the <a href="ft2-properties.html#hinting-engine">hinting-engine</a> property to select the hinting engine for CFF, Type&nbsp;1, and CID fonts.</p>
+
+<h4>values</h4>
+<table class="fields">
+<tr><td class="val" id="FT_HINTING_FREETYPE">FT_HINTING_FREETYPE</td><td class="desc">
+<p>Use the old FreeType hinting engine.</p>
+</td></tr>
+<tr><td class="val" id="FT_HINTING_ADOBE">FT_HINTING_ADOBE</td><td class="desc">
+<p>Use the hinting engine contributed by Adobe.</p>
+</td></tr>
+</table>
+
+<h4>since</h4>
+<p>2.9</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="hinting-engine">hinting-engine</h3>
+
+<p>Thanks to Adobe, which contributed a new hinting (and parsing) engine, an application can select between &lsquo;freetype&rsquo; and &lsquo;adobe&rsquo; if compiled with CFF_CONFIG_OPTION_OLD_ENGINE. If this configuration macro isn't defined, &lsquo;hinting-engine&rsquo; does nothing.</p>
+<p>The same holds for the Type&nbsp;1 and CID modules if compiled with T1_CONFIG_OPTION_OLD_ENGINE.</p>
+<p>For the &lsquo;cff&rsquo; module, the default engine is &lsquo;freetype&rsquo; if CFF_CONFIG_OPTION_OLD_ENGINE is defined, and &lsquo;adobe&rsquo; otherwise.</p>
+<p>For both the &lsquo;type1&rsquo; and &lsquo;t1cid&rsquo; modules, the default engine is &lsquo;freetype&rsquo; if T1_CONFIG_OPTION_OLD_ENGINE is defined, and &lsquo;adobe&rsquo; otherwise.</p>
+<p>The following example code demonstrates how to select Adobe's hinting engine for the &lsquo;cff&rsquo; module (omitting the error handling).</p>
+<pre class="colored">
+  FT_Library  library;
+  FT_UInt     hinting_engine = FT_CFF_HINTING_ADOBE;
+
+
+  FT_Init_FreeType( &amp;library );
+
+  FT_Property_Set( library, "cff",
+                            "hinting-engine", &amp;hinting_engine );
+</pre>
+
+<h4>note</h4>
+<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
+<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable (using values &lsquo;adobe&rsquo; or &lsquo;freetype&rsquo;).</p>
+
+<h4>since</h4>
+<p>2.4.12 (for &lsquo;cff&rsquo; module)</p>
+<p>2.9 (for &lsquo;type1&rsquo; and &lsquo;t1cid&rsquo; modules)</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="no-stem-darkening">no-stem-darkening</h3>
+
+<p>All glyphs that pass through the auto-hinter will be emboldened unless this property is set to TRUE. The same is true for the CFF, Type&nbsp;1, and CID font modules if the &lsquo;Adobe&rsquo; engine is selected (which is the default).</p>
+<p>Stem darkening emboldens glyphs at smaller sizes to make them more readable on common low-DPI screens when using linear alpha blending and gamma correction, see <a href="ft2-base_interface.html#FT_Render_Glyph">FT_Render_Glyph</a>. When not using linear alpha blending and gamma correction, glyphs will appear heavy and fuzzy!</p>
+<p>Gamma correction essentially lightens fonts since shades of grey are shifted to higher pixel values (=&nbsp;higher brightness) to match the original intention to the reality of our screens. The side-effect is that glyphs &lsquo;thin out&rsquo;. Mac OS&nbsp;X and Adobe's proprietary font rendering library implement a counter-measure: stem darkening at smaller sizes where shades of gray dominate. By emboldening a glyph slightly in relation to its pixel size, individual pixels get higher coverage of filled-in outlines and are therefore &lsquo;blacker&rsquo;. This counteracts the &lsquo;thinning out&rsquo; of glyphs, making text remain readable at smaller sizes.</p>
+<p>By default, the Adobe engines for CFF, Type&nbsp;1, and CID fonts darken stems at smaller sizes, regardless of hinting, to enhance contrast. Setting this property, stem darkening gets switched off.</p>
+<p>For the auto-hinter, stem-darkening is experimental currently and thus switched off by default (this is, &lsquo;no-stem-darkening&rsquo; is set to TRUE by default). Total consistency with the CFF driver is not achieved right now because the emboldening method differs and glyphs must be scaled down on the Y-axis to keep outline points inside their precomputed blue zones. The smaller the size (especially 9ppem and down), the higher the loss of emboldening versus the CFF driver.</p>
+<p>Note that stem darkening is never applied if <a href="ft2-base_interface.html#FT_LOAD_XXX">FT_LOAD_NO_SCALE</a> is set.</p>
+<pre class="colored">
+  FT_Library  library;
+  FT_Bool     no_stem_darkening = TRUE;
+
+
+  FT_Init_FreeType( &amp;library );
+
+  FT_Property_Set( library, "cff",
+                            "no-stem-darkening", &amp;no_stem_darkening );
+</pre>
+
+<h4>note</h4>
+<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
+<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable (using values 1 and 0 for &lsquo;on&rsquo; and &lsquo;off&rsquo;, respectively). It can also be set per face using <a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a> with <a href="ft2-parameter_tags.html#FT_PARAM_TAG_STEM_DARKENING">FT_PARAM_TAG_STEM_DARKENING</a>.</p>
+
+<h4>since</h4>
+<p>2.4.12 (for &lsquo;cff&rsquo; module)</p>
+<p>2.6.2 (for &lsquo;autofitter&rsquo; module)</p>
+<p>2.9 (for &lsquo;type1&rsquo; and &lsquo;t1cid&rsquo; modules)</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="darkening-parameters">darkening-parameters</h3>
+
+<p>By default, the Adobe hinting engine, as used by the CFF, Type&nbsp;1, and CID font drivers, darkens stems as follows (if the &lsquo;no-stem-darkening&rsquo; property isn't set):</p>
+<pre class="colored">
+  stem width &lt;= 0.5px:   darkening amount = 0.4px
+  stem width  = 1px:     darkening amount = 0.275px
+  stem width  = 1.667px: darkening amount = 0.275px
+  stem width &gt;= 2.333px: darkening amount = 0px
+</pre>
+<p>and piecewise linear in-between. At configuration time, these four control points can be set with the macro &lsquo;CFF_CONFIG_OPTION_DARKENING_PARAMETERS&rsquo;; the CFF, Type&nbsp;1, and CID drivers share these values. At runtime, the control points can be changed using the &lsquo;darkening-parameters&rsquo; property, as the following example demonstrates for the Type&nbsp;1 driver.</p>
+<pre class="colored">
+  FT_Library  library;
+  FT_Int      darken_params[8] = {  500, 300,   // x1, y1
+                                   1000, 200,   // x2, y2
+                                   1500, 100,   // x3, y3
+                                   2000,   0 }; // x4, y4
+
+
+  FT_Init_FreeType( &amp;library );
+
+  FT_Property_Set( library, "type1",
+                            "darkening-parameters", darken_params );
+</pre>
+<p>The x&nbsp;values give the stem width, and the y&nbsp;values the darkening amount. The unit is 1000th of pixels. All coordinate values must be positive; the x&nbsp;values must be monotonically increasing; the y&nbsp;values must be monotonically decreasing and smaller than or equal to 500 (corresponding to half a pixel); the slope of each linear piece must be shallower than -1 (e.g., -.4).</p>
+<p>The auto-hinter provides this property, too, as an experimental feature. See <a href="ft2-properties.html#no-stem-darkening">no-stem-darkening</a> for more.</p>
+
+<h4>note</h4>
+<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
+<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable, using eight comma-separated integers without spaces. Here the above example, using &lsquo;\&rsquo; to break the line for readability.</p>
+<pre class="colored">
+  FREETYPE_PROPERTIES=\
+  type1:darkening-parameters=500,300,1000,200,1500,100,2000,0
+</pre>
+
+<h4>since</h4>
+<p>2.5.1 (for &lsquo;cff&rsquo; module)</p>
+<p>2.6.2 (for &lsquo;autofitter&rsquo; module)</p>
+<p>2.9 (for &lsquo;type1&rsquo; and &lsquo;t1cid&rsquo; modules)</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="random-seed">random-seed</h3>
+
+<p>By default, the seed value for the CFF &lsquo;random&rsquo; operator and the similar &lsquo;0 28 callothersubr pop&rsquo; command for the Type&nbsp;1 and CID drivers is set to a random value. However, mainly for debugging purposes, it is often necessary to use a known value as a seed so that the pseudo-random number sequences generated by &lsquo;random&rsquo; are repeatable.</p>
+<p>The &lsquo;random-seed&rsquo; property does that. Its argument is a signed 32bit integer; if the value is zero or negative, the seed given by the &lsquo;intitialRandomSeed&rsquo; private DICT operator in a CFF file gets used (or a default value if there is no such operator). If the value is positive, use it instead of &lsquo;initialRandomSeed&rsquo;, which is consequently ignored.</p>
+
+<h4>note</h4>
+<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable. It can also be set per face using <a href="ft2-base_interface.html#FT_Face_Properties">FT_Face_Properties</a> with <a href="ft2-parameter_tags.html#FT_PARAM_TAG_RANDOM_SEED">FT_PARAM_TAG_RANDOM_SEED</a>.</p>
+
+<h4>since</h4>
+<p>2.8 (for &lsquo;cff&rsquo; module)</p>
+<p>2.9 (for &lsquo;type1&rsquo; and &lsquo;t1cid&rsquo; modules)</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="no-long-family-names">no-long-family-names</h3>
+
+<p>If PCF_CONFIG_OPTION_LONG_FAMILY_NAMES is active while compiling FreeType, the PCF driver constructs long family names.</p>
+<p>There are many PCF fonts just called &lsquo;Fixed&rsquo; which look completely different, and which have nothing to do with each other. When selecting &lsquo;Fixed&rsquo; in KDE or Gnome one gets results that appear rather random, the style changes often if one changes the size and one cannot select some fonts at all. The improve this situation, the PCF module prepends the foundry name (plus a space) to the family name. It also checks whether there are &lsquo;wide&rsquo; characters; all put together, family names like &lsquo;Sony Fixed&rsquo; or &lsquo;Misc Fixed Wide&rsquo; are constructed.</p>
+<p>If &lsquo;no-long-family-names&rsquo; is set, this feature gets switched off.</p>
+<pre class="colored">
+  FT_Library  library;
+  FT_Bool     no_long_family_names = TRUE;
+
+
+  FT_Init_FreeType( &amp;library );
+
+  FT_Property_Set( library, "pcf",
+                            "no-long-family-names",
+                            &amp;no_long_family_names );
+</pre>
+
+<h4>note</h4>
+<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
+<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable (using values 1 and 0 for &lsquo;on&rsquo; and &lsquo;off&rsquo;, respectively).</p>
+
+<h4>since</h4>
+<p>2.8</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="TT_INTERPRETER_VERSION_XXX">TT_INTERPRETER_VERSION_XXX</h3>
+<p>Defined in FT_DRIVER_H (freetype/ftdriver.h).</p>
+<pre>
+#define <a href="ft2-properties.html#TT_INTERPRETER_VERSION_35">TT_INTERPRETER_VERSION_35</a>  35
+#define <a href="ft2-properties.html#TT_INTERPRETER_VERSION_38">TT_INTERPRETER_VERSION_38</a>  38
+#define <a href="ft2-properties.html#TT_INTERPRETER_VERSION_40">TT_INTERPRETER_VERSION_40</a>  40
+</pre>
+
+<p>A list of constants used for the <a href="ft2-properties.html#interpreter-version">interpreter-version</a> property to select the hinting engine for Truetype fonts.</p>
+<p>The numeric value in the constant names represents the version number as returned by the &lsquo;GETINFO&rsquo; bytecode instruction.</p>
+
+<h4>values</h4>
+<table class="fields">
+<tr><td class="val" id="TT_INTERPRETER_VERSION_35">TT_INTERPRETER_VERSION_35</td><td class="desc">
+<p>Version&nbsp;35 corresponds to MS rasterizer v.1.7 as used e.g. in Windows&nbsp;98; only grayscale and B/W rasterizing is supported.</p>
+</td></tr>
+<tr><td class="val" id="TT_INTERPRETER_VERSION_38">TT_INTERPRETER_VERSION_38</td><td class="desc">
+<p>Version&nbsp;38 corresponds to MS rasterizer v.1.9; it is roughly equivalent to the hinting provided by DirectWrite ClearType (as can be found, for example, in the Internet Explorer&nbsp;9 running on Windows&nbsp;7). It is used in FreeType to select the &lsquo;Infinality&rsquo; subpixel hinting code. The code may be removed in a future version.</p>
+</td></tr>
+<tr><td class="val" id="TT_INTERPRETER_VERSION_40">TT_INTERPRETER_VERSION_40</td><td class="desc">
+<p>Version&nbsp;40 corresponds to MS rasterizer v.2.1; it is roughly equivalent to the hinting provided by DirectWrite ClearType (as can be found, for example, in Microsoft's Edge Browser on Windows&nbsp;10). It is used in FreeType to select the &lsquo;minimal&rsquo; subpixel hinting code, a stripped-down and higher performance version of the &lsquo;Infinality&rsquo; code.</p>
+</td></tr>
+</table>
+
+<h4>note</h4>
+<p>This property controls the behaviour of the bytecode interpreter and thus how outlines get hinted. It does <b>not</b> control how glyph get rasterized! In particular, it does not control subpixel color filtering.</p>
+<p>If FreeType has not been compiled with the configuration option TT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version&nbsp;38 or&nbsp;40 causes an &lsquo;FT_Err_Unimplemented_Feature&rsquo; error.</p>
+<p>Depending on the graphics framework, Microsoft uses different bytecode and rendering engines. As a consequence, the version numbers returned by a call to the &lsquo;GETINFO&rsquo; bytecode instruction are more convoluted than desired.</p>
+<p>Here are two tables that try to shed some light on the possible values for the MS rasterizer engine, together with the additional features introduced by it.</p>
+<pre class="colored">
+  GETINFO framework               version feature
+  -------------------------------------------------------------------
+      3   GDI (Win 3.1),            v1.0  16-bit, first version
+          TrueImage
+     33   GDI (Win NT 3.1),         v1.5  32-bit
+          HP Laserjet
+     34   GDI (Win 95)              v1.6  font smoothing,
+                                          new SCANTYPE opcode
+     35   GDI (Win 98/2000)         v1.7  (UN)SCALED_COMPONENT_OFFSET
+                                            bits in composite glyphs
+     36   MGDI (Win CE 2)           v1.6+ classic ClearType
+     37   GDI (XP and later),       v1.8  ClearType
+          GDI+ old (before Vista)
+     38   GDI+ old (Vista, Win 7),  v1.9  subpixel ClearType,
+          WPF                             Y-direction ClearType,
+                                          additional error checking
+     39   DWrite (before Win 8)     v2.0  subpixel ClearType flags
+                                            in GETINFO opcode,
+                                          bug fixes
+     40   GDI+ (after Win 7),       v2.1  Y-direction ClearType flag
+          DWrite (Win 8)                    in GETINFO opcode,
+                                          Gray ClearType
+</pre>
+<p>The &lsquo;version&rsquo; field gives a rough orientation only, since some applications provided certain features much earlier (as an example, Microsoft Reader used subpixel and Y-direction ClearType already in Windows 2000). Similarly, updates to a given framework might include improved hinting support.</p>
+<pre class="colored">
+   version   sampling          rendering        comment
+            x        y       x           y
+  --------------------------------------------------------------
+    v1.0   normal  normal  B/W           B/W    bi-level
+    v1.6   high    high    gray          gray   grayscale
+    v1.8   high    normal  color-filter  B/W    (GDI) ClearType
+    v1.9   high    high    color-filter  gray   Color ClearType
+    v2.1   high    normal  gray          B/W    Gray ClearType
+    v2.1   high    high    gray          gray   Gray ClearType
+</pre>
+<p>Color and Gray ClearType are the two available variants of &lsquo;Y-direction ClearType&rsquo;, meaning grayscale rasterization along the Y-direction; the name used in the TrueType specification for this feature is &lsquo;symmetric smoothing&rsquo;. &lsquo;Classic ClearType&rsquo; is the original algorithm used before introducing a modified version in Win&nbsp;XP. Another name for v1.6's grayscale rendering is &lsquo;font smoothing&rsquo;, and &lsquo;Color ClearType&rsquo; is sometimes also called &lsquo;DWrite ClearType&rsquo;. To differentiate between today's Color ClearType and the earlier ClearType variant with B/W rendering along the vertical axis, the latter is sometimes called &lsquo;GDI ClearType&rsquo;.</p>
+<p>&lsquo;Normal&rsquo; and &lsquo;high&rsquo; sampling describe the (virtual) resolution to access the rasterized outline after the hinting process. &lsquo;Normal&rsquo; means 1 sample per grid line (i.e., B/W). In the current Microsoft implementation, &lsquo;high&rsquo; means an extra virtual resolution of 16x16 (or 16x1) grid lines per pixel for bytecode instructions like &lsquo;MIRP&rsquo;. After hinting, these 16 grid lines are mapped to 6x5 (or 6x1) grid lines for color filtering if Color ClearType is activated.</p>
+<p>Note that &lsquo;Gray ClearType&rsquo; is essentially the same as v1.6's grayscale rendering. However, the GETINFO instruction handles it differently: v1.6 returns bit&nbsp;12 (hinting for grayscale), while v2.1 returns bits&nbsp;13 (hinting for ClearType), 18 (symmetrical smoothing), and&nbsp;19 (Gray ClearType). Also, this mode respects bits 2 and&nbsp;3 for the version&nbsp;1 gasp table exclusively (like Color ClearType), while v1.6 only respects the values of version&nbsp;0 (bits 0 and&nbsp;1).</p>
+<p>Keep in mind that the features of the above interpreter versions might not map exactly to FreeType features or behavior because it is a fundamentally different library with different internals.</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="interpreter-version">interpreter-version</h3>
+
+<p>Currently, three versions are available, two representing the bytecode interpreter with subpixel hinting support (old &lsquo;Infinality&rsquo; code and new stripped-down and higher performance &lsquo;minimal&rsquo; code) and one without, respectively. The default is subpixel support if TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel support otherwise (since it isn't available then).</p>
+<p>If subpixel hinting is on, many TrueType bytecode instructions behave differently compared to B/W or grayscale rendering (except if &lsquo;native ClearType&rsquo; is selected by the font). Microsoft's main idea is to render at a much increased horizontal resolution, then sampling down the created output to subpixel precision. However, many older fonts are not suited to this and must be specially taken care of by applying (hardcoded) tweaks in Microsoft's interpreter.</p>
+<p>Details on subpixel hinting and some of the necessary tweaks can be found in Greg Hitchcock's whitepaper at &lsquo;<a href="https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx">https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx</a>&rsquo;. Note that FreeType currently doesn't really &lsquo;subpixel hint&rsquo; (6x1, 6x2, or 6x5 supersampling) like discussed in the paper. Depending on the chosen interpreter, it simply ignores instructions on vertical stems to arrive at very similar results.</p>
+<p>The following example code demonstrates how to deactivate subpixel hinting (omitting the error handling).</p>
+<pre class="colored">
+  FT_Library  library;
+  FT_Face     face;
+  FT_UInt     interpreter_version = TT_INTERPRETER_VERSION_35;
+
+
+  FT_Init_FreeType( &amp;library );
+
+  FT_Property_Set( library, "truetype",
+                            "interpreter-version",
+                            &amp;interpreter_version );
+</pre>
+
+<h4>note</h4>
+<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
+<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable (using values &lsquo;35&rsquo;, &lsquo;38&rsquo;, or &lsquo;40&rsquo;).</p>
+
+<h4>since</h4>
+<p>2.5</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="glyph-to-script-map">glyph-to-script-map</h3>
+
+<p><b>Experimental</b> <b>only</b></p>
+<p>The auto-hinter provides various script modules to hint glyphs. Examples of supported scripts are Latin or CJK. Before a glyph is auto-hinted, the Unicode character map of the font gets examined, and the script is then determined based on Unicode character ranges, see below.</p>
+<p>OpenType fonts, however, often provide much more glyphs than character codes (small caps, superscripts, ligatures, swashes, etc.), to be controlled by so-called &lsquo;features&rsquo;. Handling OpenType features can be quite complicated and thus needs a separate library on top of FreeType.</p>
+<p>The mapping between glyph indices and scripts (in the auto-hinter sense, see the <a href="ft2-properties.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_XXX</a> values) is stored as an array with &lsquo;num_glyphs&rsquo; elements, as found in the font's <a href="ft2-base_interface.html#FT_Face">FT_Face</a> structure. The &lsquo;glyph-to-script-map&rsquo; property returns a pointer to this array, which can be modified as needed. Note that the modification should happen before the first glyph gets processed by the auto-hinter so that the global analysis of the font shapes actually uses the modified mapping.</p>
+<p>The following example code demonstrates how to access it (omitting the error handling).</p>
+<pre class="colored">
+  FT_Library                library;
+  FT_Face                   face;
+  FT_Prop_GlyphToScriptMap  prop;
+
+
+  FT_Init_FreeType( &amp;library );
+  FT_New_Face( library, "foo.ttf", 0, &amp;face );
+
+  prop.face = face;
+
+  FT_Property_Get( library, "autofitter",
+                            "glyph-to-script-map", &amp;prop );
+
+  // adjust `prop.map' as needed right here
+
+  FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );
+</pre>
+
+<h4>since</h4>
+<p>2.4.11</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_XXX</h3>
+<p>Defined in FT_DRIVER_H (freetype/ftdriver.h).</p>
+<pre>
+#define <a href="ft2-properties.html#FT_AUTOHINTER_SCRIPT_NONE">FT_AUTOHINTER_SCRIPT_NONE</a>   0
+#define <a href="ft2-properties.html#FT_AUTOHINTER_SCRIPT_LATIN">FT_AUTOHINTER_SCRIPT_LATIN</a>  1
+#define <a href="ft2-properties.html#FT_AUTOHINTER_SCRIPT_CJK">FT_AUTOHINTER_SCRIPT_CJK</a>    2
+#define <a href="ft2-properties.html#FT_AUTOHINTER_SCRIPT_INDIC">FT_AUTOHINTER_SCRIPT_INDIC</a>  3
+</pre>
+
+<p><b>Experimental</b> <b>only</b></p>
+<p>A list of constants used for the <a href="ft2-properties.html#glyph-to-script-map">glyph-to-script-map</a> property to specify the script submodule the auto-hinter should use for hinting a particular glyph.</p>
+
+<h4>values</h4>
+<table class="fields">
+<tr><td class="val" id="FT_AUTOHINTER_SCRIPT_NONE">FT_AUTOHINTER_SCRIPT_NONE</td><td class="desc">
+<p>Don't auto-hint this glyph.</p>
+</td></tr>
+<tr><td class="val" id="FT_AUTOHINTER_SCRIPT_LATIN">FT_AUTOHINTER_SCRIPT_LATIN</td><td class="desc">
+<p>Apply the latin auto-hinter. For the auto-hinter, &lsquo;latin&rsquo; is a very broad term, including Cyrillic and Greek also since characters from those scripts share the same design constraints.</p>
+<p>By default, characters from the following Unicode ranges are assigned to this submodule.</p>
+<pre class="colored">
+  U+0020 - U+007F  // Basic Latin (no control characters)
+  U+00A0 - U+00FF  // Latin-1 Supplement (no control characters)
+  U+0100 - U+017F  // Latin Extended-A
+  U+0180 - U+024F  // Latin Extended-B
+  U+0250 - U+02AF  // IPA Extensions
+  U+02B0 - U+02FF  // Spacing Modifier Letters
+  U+0300 - U+036F  // Combining Diacritical Marks
+  U+0370 - U+03FF  // Greek and Coptic
+  U+0400 - U+04FF  // Cyrillic
+  U+0500 - U+052F  // Cyrillic Supplement
+  U+1D00 - U+1D7F  // Phonetic Extensions
+  U+1D80 - U+1DBF  // Phonetic Extensions Supplement
+  U+1DC0 - U+1DFF  // Combining Diacritical Marks Supplement
+  U+1E00 - U+1EFF  // Latin Extended Additional
+  U+1F00 - U+1FFF  // Greek Extended
+  U+2000 - U+206F  // General Punctuation
+  U+2070 - U+209F  // Superscripts and Subscripts
+  U+20A0 - U+20CF  // Currency Symbols
+  U+2150 - U+218F  // Number Forms
+  U+2460 - U+24FF  // Enclosed Alphanumerics
+  U+2C60 - U+2C7F  // Latin Extended-C
+  U+2DE0 - U+2DFF  // Cyrillic Extended-A
+  U+2E00 - U+2E7F  // Supplemental Punctuation
+  U+A640 - U+A69F  // Cyrillic Extended-B
+  U+A720 - U+A7FF  // Latin Extended-D
+  U+FB00 - U+FB06  // Alphab. Present. Forms (Latin Ligatures)
+ U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols
+ U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement
+</pre>
+<p></p>
+</td></tr>
+<tr><td class="val" id="FT_AUTOHINTER_SCRIPT_CJK">FT_AUTOHINTER_SCRIPT_CJK</td><td class="desc">
+<p>Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old Vietnamese, and some other scripts.</p>
+<p>By default, characters from the following Unicode ranges are assigned to this submodule.</p>
+<pre class="colored">
+  U+1100 - U+11FF  // Hangul Jamo
+  U+2E80 - U+2EFF  // CJK Radicals Supplement
+  U+2F00 - U+2FDF  // Kangxi Radicals
+  U+2FF0 - U+2FFF  // Ideographic Description Characters
+  U+3000 - U+303F  // CJK Symbols and Punctuation
+  U+3040 - U+309F  // Hiragana
+  U+30A0 - U+30FF  // Katakana
+  U+3100 - U+312F  // Bopomofo
+  U+3130 - U+318F  // Hangul Compatibility Jamo
+  U+3190 - U+319F  // Kanbun
+  U+31A0 - U+31BF  // Bopomofo Extended
+  U+31C0 - U+31EF  // CJK Strokes
+  U+31F0 - U+31FF  // Katakana Phonetic Extensions
+  U+3200 - U+32FF  // Enclosed CJK Letters and Months
+  U+3300 - U+33FF  // CJK Compatibility
+  U+3400 - U+4DBF  // CJK Unified Ideographs Extension A
+  U+4DC0 - U+4DFF  // Yijing Hexagram Symbols
+  U+4E00 - U+9FFF  // CJK Unified Ideographs
+  U+A960 - U+A97F  // Hangul Jamo Extended-A
+  U+AC00 - U+D7AF  // Hangul Syllables
+  U+D7B0 - U+D7FF  // Hangul Jamo Extended-B
+  U+F900 - U+FAFF  // CJK Compatibility Ideographs
+  U+FE10 - U+FE1F  // Vertical forms
+  U+FE30 - U+FE4F  // CJK Compatibility Forms
+  U+FF00 - U+FFEF  // Halfwidth and Fullwidth Forms
+ U+1B000 - U+1B0FF // Kana Supplement
+ U+1D300 - U+1D35F // Tai Xuan Hing Symbols
+ U+1F200 - U+1F2FF // Enclosed Ideographic Supplement
+ U+20000 - U+2A6DF // CJK Unified Ideographs Extension B
+ U+2A700 - U+2B73F // CJK Unified Ideographs Extension C
+ U+2B740 - U+2B81F // CJK Unified Ideographs Extension D
+ U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement
+</pre>
+<p></p>
+</td></tr>
+<tr><td class="val" id="FT_AUTOHINTER_SCRIPT_INDIC">FT_AUTOHINTER_SCRIPT_INDIC</td><td class="desc">
+<p>Apply the indic auto-hinter, covering all major scripts from the Indian sub-continent and some other related scripts like Thai, Lao, or Tibetan.</p>
+<p>By default, characters from the following Unicode ranges are assigned to this submodule.</p>
+<pre class="colored">
+  U+0900 - U+0DFF  // Indic Range
+  U+0F00 - U+0FFF  // Tibetan
+  U+1900 - U+194F  // Limbu
+  U+1B80 - U+1BBF  // Sundanese
+  U+A800 - U+A82F  // Syloti Nagri
+  U+ABC0 - U+ABFF  // Meetei Mayek
+ U+11800 - U+118DF // Sharada
+</pre>
+<p>Note that currently Indic support is rudimentary only, missing blue zone support.</p>
+</td></tr>
+</table>
+
+<h4>since</h4>
+<p>2.4.11</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="FT_Prop_GlyphToScriptMap">FT_Prop_GlyphToScriptMap</h3>
+<p>Defined in FT_DRIVER_H (freetype/ftdriver.h).</p>
+<pre>
+  <span class="keyword">typedef</span> <span class="keyword">struct</span>  FT_Prop_GlyphToScriptMap_
+  {
+    <a href="ft2-base_interface.html#FT_Face">FT_Face</a>     face;
+    <a href="ft2-basic_types.html#FT_UShort">FT_UShort</a>*  map;
+
+  } <b>FT_Prop_GlyphToScriptMap</b>;
+</pre>
+
+<p><b>Experimental</b> <b>only</b></p>
+<p>The data exchange structure for the <a href="ft2-properties.html#glyph-to-script-map">glyph-to-script-map</a> property.</p>
+
+<h4>since</h4>
+<p>2.4.11</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="fallback-script">fallback-script</h3>
+
+<p><b>Experimental</b> <b>only</b></p>
+<p>If no auto-hinter script module can be assigned to a glyph, a fallback script gets assigned to it (see also the <a href="ft2-properties.html#glyph-to-script-map">glyph-to-script-map</a> property). By default, this is <a href="ft2-properties.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_CJK</a>. Using the &lsquo;fallback-script&rsquo; property, this fallback value can be changed.</p>
+<pre class="colored">
+  FT_Library  library;
+  FT_UInt     fallback_script = FT_AUTOHINTER_SCRIPT_NONE;
+
+
+  FT_Init_FreeType( &amp;library );
+
+  FT_Property_Set( library, "autofitter",
+                            "fallback-script", &amp;fallback_script );
+</pre>
+
+<h4>note</h4>
+<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
+<p>It's important to use the right timing for changing this value: The creation of the glyph-to-script map that eventually uses the fallback script value gets triggered either by setting or reading a face-specific property like <a href="ft2-properties.html#glyph-to-script-map">glyph-to-script-map</a>, or by auto-hinting any glyph from that face. In particular, if you have already created an <a href="ft2-base_interface.html#FT_Face">FT_Face</a> structure but not loaded any glyph (using the auto-hinter), a change of the fallback script will affect this face.</p>
+
+<h4>since</h4>
+<p>2.4.11</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="default-script">default-script</h3>
+
+<p><b>Experimental</b> <b>only</b></p>
+<p>If FreeType gets compiled with FT_CONFIG_OPTION_USE_HARFBUZZ to make the HarfBuzz library access OpenType features for getting better glyph coverages, this property sets the (auto-fitter) script to be used for the default (OpenType) script data of a font's GSUB table. Features for the default script are intended for all scripts not explicitly handled in GSUB; an example is a &lsquo;dlig&rsquo; feature, containing the combination of the characters &lsquo;T&rsquo;, &lsquo;E&rsquo;, and &lsquo;L&rsquo; to form a &lsquo;TEL&rsquo; ligature.</p>
+<p>By default, this is <a href="ft2-properties.html#FT_AUTOHINTER_SCRIPT_XXX">FT_AUTOHINTER_SCRIPT_LATIN</a>. Using the &lsquo;default-script&rsquo; property, this default value can be changed.</p>
+<pre class="colored">
+  FT_Library  library;
+  FT_UInt     default_script = FT_AUTOHINTER_SCRIPT_NONE;
+
+
+  FT_Init_FreeType( &amp;library );
+
+  FT_Property_Set( library, "autofitter",
+                            "default-script", &amp;default_script );
+</pre>
+
+<h4>note</h4>
+<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
+<p>It's important to use the right timing for changing this value: The creation of the glyph-to-script map that eventually uses the default script value gets triggered either by setting or reading a face-specific property like <a href="ft2-properties.html#glyph-to-script-map">glyph-to-script-map</a>, or by auto-hinting any glyph from that face. In particular, if you have already created an <a href="ft2-base_interface.html#FT_Face">FT_Face</a> structure but not loaded any glyph (using the auto-hinter), a change of the default script will affect this face.</p>
+
+<h4>since</h4>
+<p>2.5.3</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="increase-x-height">increase-x-height</h3>
+
+<p>For ppem values in the range 6&nbsp;&lt;= ppem &lt;= &lsquo;increase-x-height&rsquo;, round up the font's x&nbsp;height much more often than normally. If the value is set to&nbsp;0, which is the default, this feature is switched off. Use this property to improve the legibility of small font sizes if necessary.</p>
+<pre class="colored">
+  FT_Library               library;
+  FT_Face                  face;
+  FT_Prop_IncreaseXHeight  prop;
+
+
+  FT_Init_FreeType( &amp;library );
+  FT_New_Face( library, "foo.ttf", 0, &amp;face );
+  FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );
+
+  prop.face  = face;
+  prop.limit = 14;
+
+  FT_Property_Set( library, "autofitter",
+                            "increase-x-height", &amp;prop );
+</pre>
+
+<h4>note</h4>
+<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
+<p>Set this value right after calling <a href="ft2-base_interface.html#FT_Set_Char_Size">FT_Set_Char_Size</a>, but before loading any glyph (using the auto-hinter).</p>
+
+<h4>since</h4>
+<p>2.4.11</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="FT_Prop_IncreaseXHeight">FT_Prop_IncreaseXHeight</h3>
+<p>Defined in FT_DRIVER_H (freetype/ftdriver.h).</p>
+<pre>
+  <span class="keyword">typedef</span> <span class="keyword">struct</span>  FT_Prop_IncreaseXHeight_
+  {
+    <a href="ft2-base_interface.html#FT_Face">FT_Face</a>  face;
+    <a href="ft2-basic_types.html#FT_UInt">FT_UInt</a>  limit;
+
+  } <b>FT_Prop_IncreaseXHeight</b>;
+</pre>
+
+<p>The data exchange structure for the <a href="ft2-properties.html#increase-x-height">increase-x-height</a> property.</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+<div class="section">
+<h3 id="warping">warping</h3>
+
+<p><b>Experimental</b> <b>only</b></p>
+<p>If FreeType gets compiled with option AF_CONFIG_OPTION_USE_WARPER to activate the warp hinting code in the auto-hinter, this property switches warping on and off.</p>
+<p>Warping only works in &lsquo;normal&rsquo; auto-hinting mode replacing it. The idea of the code is to slightly scale and shift a glyph along the non-hinted dimension (which is usually the horizontal axis) so that as much of its segments are aligned (more or less) to the grid. To find out a glyph's optimal scaling and shifting value, various parameter combinations are tried and scored.</p>
+<p>By default, warping is off. The example below shows how to switch on warping (omitting the error handling).</p>
+<pre class="colored">
+  FT_Library  library;
+  FT_Bool     warping = 1;
+
+
+  FT_Init_FreeType( &amp;library );
+
+  FT_Property_Set( library, "autofitter",
+                            "warping", &amp;warping );
+</pre>
+
+<h4>note</h4>
+<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
+<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable (using values 1 and 0 for &lsquo;on&rsquo; and &lsquo;off&rsquo;, respectively).</p>
+<p>The warping code can also change advance widths. Have a look at the &lsquo;lsb_delta&rsquo; and &lsquo;rsb_delta&rsquo; fields in the <a href="ft2-base_interface.html#FT_GlyphSlotRec">FT_GlyphSlotRec</a> structure for details on improving inter-glyph distances while rendering.</p>
+<p>Since warping is a global property of the auto-hinter it is best to change its value before rendering any face. Otherwise, you should reload all faces that get auto-hinted in &lsquo;normal&rsquo; hinting mode.</p>
+
+<h4>since</h4>
+<p>2.6</p>
+
+<hr>
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
+
+</body>
+</html>
index 81b051d..e62710a 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="quick_advance">Quick retrieval of advance values</h1>
 <h2>Synopsis</h2>
index 929c5db..172fe35 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="raster">Scanline Converter</h1>
 <h2>Synopsis</h2>
 #define FT_Raster_Reset_Func  <b>FT_Raster_ResetFunc</b>
 </pre>
 
-<p>FreeType used to provide an area of memory called the &lsquo;render pool&rsquo; available to all registered rasters. This was not thread safe however and now FreeType never allocates this pool. NULL is always passed in as pool_base.</p>
-<p>This function is called each time the render pool changes, or just after a new raster object is created.</p>
+<p>FreeType used to provide an area of memory called the &lsquo;render pool&rsquo; available to all registered rasterizers. This was not thread safe, however, and now FreeType never allocates this pool.</p>
+<p>This function is called after a new raster object is created.</p>
 
 <h4>input</h4>
 <table class="fields">
 <p>A handle to the new raster object.</p>
 </td></tr>
 <tr><td class="val" id="pool_base">pool_base</td><td class="desc">
-<p>The address in memory of the render pool.</p>
+<p>Previously, the address in memory of the render pool. Set this to NULL.</p>
 </td></tr>
 <tr><td class="val" id="pool_size">pool_size</td><td class="desc">
-<p>The size in bytes of the render pool.</p>
+<p>Previously, the size in bytes of the render pool. Set this to 0.</p>
 </td></tr>
 </table>
 
 <h4>note</h4>
-<p>Rasters should ignore the render pool and rely on dynamic or stack allocation if they want to (a handle to the memory allocator is passed to the raster constructor).</p>
+<p>Rasterizers should rely on dynamic or stack allocation if they want to (a handle to the memory allocator is passed to the rasterizer constructor).</p>
 
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
index 97548e1..1b1b0cf 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="sfnt_names">SFNT Names</h1>
 <h2>Synopsis</h2>
 <table class="synopsis">
-<tr><td><a href="#FT_SfntName">FT_SfntName</a></td></tr>
-<tr><td><a href="#FT_Get_Sfnt_Name_Count">FT_Get_Sfnt_Name_Count</a></td></tr>
-<tr><td><a href="#FT_Get_Sfnt_Name">FT_Get_Sfnt_Name</a></td></tr>
-<tr><td><a href="#FT_SfntLangTag">FT_SfntLangTag</a></td></tr>
-<tr><td><a href="#FT_Get_Sfnt_LangTag">FT_Get_Sfnt_LangTag</a></td></tr>
-<tr><td><a href="#FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY">FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY</a></td></tr>
-<tr><td><a href="#FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY">FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY</a></td></tr>
+<tr><td><a href="#FT_SfntName">FT_SfntName</a></td><td><a href="#FT_Get_Sfnt_Name">FT_Get_Sfnt_Name</a></td><td><a href="#FT_Get_Sfnt_LangTag">FT_Get_Sfnt_LangTag</a></td></tr>
+<tr><td><a href="#FT_Get_Sfnt_Name_Count">FT_Get_Sfnt_Name_Count</a></td><td><a href="#FT_SfntLangTag">FT_SfntLangTag</a></td><td></td></tr>
 </table>
 
 
 <h4>note</h4>
 <p>Please refer to the TrueType or OpenType specification for more details.</p>
 
+<h4>since</h4>
+<p>2.8</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 <p>The &lsquo;string&rsquo; array returned in the &lsquo;alangTag&rsquo; structure is not null-terminated. Note that you don't have to deallocate &lsquo;string&rsquo; by yourself; FreeType takes care of it if you call <a href="ft2-base_interface.html#FT_Done_Face">FT_Done_Face</a>.</p>
 <p>Only &lsquo;name&rsquo; table format&nbsp;1 supports language tags. For format&nbsp;0 tables, this function always returns FT_Err_Invalid_Table. For invalid format&nbsp;1 language ID values, FT_Err_Invalid_Argument is returned.</p>
 
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY">FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY</h3>
-<p>Defined in FT_SFNT_NAMES_H (freetype/ftsnames.h).</p>
-<pre>
-#define <b>FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY</b> \
-          <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 'i', 'g', 'p', 'f' )
-
-
-  /* this constant is deprecated */
-#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY \
-          <b>FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY</b>
-</pre>
-
-<p>A tag for <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> to make <a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a> ignore typographic family names in the &lsquo;name&rsquo; table (introduced in OpenType version 1.4). Use this for backward compatibility with legacy systems that have a four-faces-per-family restriction.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY">FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY</h3>
-<p>Defined in FT_SFNT_NAMES_H (freetype/ftsnames.h).</p>
-<pre>
-#define <b>FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY</b> \
-          <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 'i', 'g', 'p', 's' )
-
-
-  /* this constant is deprecated */
-#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY \
-          <b>FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY</b>
-</pre>
-
-<p>A tag for <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> to make <a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a> ignore typographic subfamily names in the &lsquo;name&rsquo; table (introduced in OpenType version 1.4). Use this for backward compatibility with legacy systems that have a four-faces-per-family restriction.</p>
+<h4>since</h4>
+<p>2.8</p>
 
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
index 7ed1aca..fc5d28a 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="sizes_management">Size Management</h1>
 <h2>Synopsis</h2>
index 9427146..bbd2e19 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="system_interface">System Interface</h1>
 <h2>Synopsis</h2>
diff --git a/docs/reference/ft2-t1_cid_driver.html b/docs/reference/ft2-t1_cid_driver.html
new file mode 100644 (file)
index 0000000..a9a3fff
--- /dev/null
@@ -0,0 +1,114 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
+"https://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+<title>FreeType-2.9 API Reference</title>
+<style type="text/css">
+  a:link { color: #0000EF; }
+  a:visited { color: #51188E; }
+  a:hover { color: #FF0000; }
+
+  body { font-family: Verdana, Geneva, Arial, Helvetica, serif;
+         color: #000000;
+         background: #FFFFFF;
+         width: 87%;
+         margin: auto; }
+
+  div.section { width: 75%;
+                margin: auto; }
+  div.section hr { margin: 4ex 0 1ex 0; }
+  div.section h4 { background-color: #EEEEFF;
+                   font-size: medium;
+                   font-style: oblique;
+                   font-weight: bold;
+                   margin: 3ex 0 1.5ex 9%;
+                   padding: 0.3ex 0 0.3ex 1%; }
+  div.section p { margin: 1.5ex 0 1.5ex 10%; }
+  div.section pre { margin: 3ex 0 3ex 9%;
+                    background-color: #D6E8FF;
+                    padding: 2ex 0 2ex 1%; }
+  div.section table.fields { width: 90%;
+                             margin: 1.5ex 0 1.5ex 10%; }
+  div.section table.toc { width: 95%;
+                          margin: 1.5ex 0 1.5ex 5%; }
+  div.timestamp { text-align: center;
+                  font-size: 69%;
+                  margin: 1.5ex 0 1.5ex 0; }
+
+  h1 { text-align: center; }
+  h3 { font-size: medium;
+       margin: 4ex 0 1.5ex 0; }
+
+  p { text-align: justify; }
+
+  pre.colored { color: blue; }
+
+  span.keyword { font-family: monospace;
+                 text-align: left;
+                 white-space: pre;
+                 color: darkblue; }
+
+  table.fields td.val { font-weight: bold;
+                        text-align: right;
+                        width: 30%;
+                        vertical-align: baseline;
+                        padding: 1ex 1em 1ex 0; }
+  table.fields td.desc { vertical-align: baseline;
+                         padding: 1ex 0 1ex 1em; }
+  table.fields td.desc p:first-child { margin: 0; }
+  table.fields td.desc p { margin: 1.5ex 0 0 0; }
+  table.index { margin: 6ex auto 6ex auto;
+                border: 0;
+                border-collapse: separate;
+                border-spacing: 1em 0.3ex; }
+  table.index tr { padding: 0; }
+  table.index td { padding: 0; }
+  table.index-toc-link { width: 100%;
+                         border: 0;
+                         border-spacing: 0;
+                         margin: 1ex 0 1ex 0; }
+  table.index-toc-link td.left { padding: 0 0.5em 0 0.5em;
+                                 font-size: 83%;
+                                 text-align: left; }
+  table.index-toc-link td.middle { padding: 0 0.5em 0 0.5em;
+                                   font-size: 83%;
+                                   text-align: center; }
+  table.index-toc-link td.right { padding: 0 0.5em 0 0.5em;
+                                  font-size: 83%;
+                                  text-align: right; }
+  table.synopsis { margin: 6ex auto 6ex auto;
+                   border: 0;
+                   border-collapse: separate;
+                   border-spacing: 2em 0.6ex; }
+  table.synopsis tr { padding: 0; }
+  table.synopsis td { padding: 0; }
+  table.toc td.link { width: 30%;
+                      text-align: right;
+                      vertical-align: baseline;
+                      padding: 1ex 1em 1ex 0; }
+  table.toc td.desc { vertical-align: baseline;
+                      padding: 1ex 0 1ex 1em;
+                      text-align: left; }
+  table.toc td.desc p:first-child { margin: 0;
+                                    text-align: left; }
+  table.toc td.desc p { margin: 1.5ex 0 0 0;
+                        text-align: left; }
+
+</style>
+</head>
+<body>
+
+<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
+<h1>FreeType-2.9 API Reference</h1>
+
+<h1 id="t1_cid_driver">The Type 1 and CID drivers</h1>
+
+<p>It is possible to control the behaviour of FreeType's Type&nbsp;1 and Type&nbsp;1 CID drivers with <a href="ft2-module_management.html#FT_Property_Set">FT_Property_Set</a> and <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a>.</p>
+<p>Behind the scenes, both drivers use the Adobe CFF engine for hinting; however, the used properties must be specified separately.</p>
+<p>The Type&nbsp;1 driver's module name is &lsquo;type1&rsquo;; the CID driver's module name is &lsquo;t1cid&rsquo;.</p>
+<p>Available properties are <a href="ft2-properties.html#hinting-engine">hinting-engine</a>, <a href="ft2-properties.html#no-stem-darkening">no-stem-darkening</a>, <a href="ft2-properties.html#darkening-parameters">darkening-parameters</a>, and <a href="ft2-properties.html#random-seed">random-seed</a>, as documented in the &lsquo;<a href="ft2-properties.html#properties">Driver properties</a>&rsquo; section.</p>
+<p>Please see the &lsquo;<a href="ft2-cff_driver.html#cff_driver">The CFF driver</a>&rsquo; section for more details on the new hinting engine.</p>
+
+</body>
+</html>
index ace5445..b169b31 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1>Table of Contents</h1>
 <div class="section">
 <tr><td class="link"><a href="ft2-cff_driver.html">The CFF driver</a></td><td class="desc">
 <p>Controlling the CFF driver module.</p>
 </td></tr>
+<tr><td class="link"><a href="ft2-t1_cid_driver.html">The Type 1 and CID drivers</a></td><td class="desc">
+<p>Controlling the Type&nbsp;1 and CID driver modules.</p>
+</td></tr>
 <tr><td class="link"><a href="ft2-tt_driver.html">The TrueType driver</a></td><td class="desc">
 <p>Controlling the TrueType driver module.</p>
 </td></tr>
 <tr><td class="link"><a href="ft2-pcf_driver.html">The PCF driver</a></td><td class="desc">
 <p>Controlling the PCF driver module.</p>
 </td></tr>
+<tr><td class="link"><a href="ft2-properties.html">Driver properties</a></td><td class="desc">
+<p>Controlling driver modules.</p>
+</td></tr>
+<tr><td class="link"><a href="ft2-parameter_tags.html">Parameter Tags</a></td><td class="desc">
+<p>Macros for driver property and font loading parameter tags.</p>
+</td></tr>
 </table>
 </div>
 <div class="section">
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td></tr></table>
 
-<div class="timestamp">generated on Sat May 13 12:45:59 2017</div></body>
+<div class="timestamp">generated on Mon Jan  8 12:30:20 2018</div></body>
 </html>
index 25725ec..1a6d26c 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="truetype_engine">The TrueType Engine</h1>
 <h2>Synopsis</h2>
index b5d3446..c3d2caa 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="truetype_tables">TrueType Tables</h1>
 <h2>Synopsis</h2>
 <table class="synopsis">
-<tr><td><a href="#TT_Header">TT_Header</a></td><td><a href="#FT_Get_CMap_Format">FT_Get_CMap_Format</a></td></tr>
-<tr><td><a href="#TT_HoriHeader">TT_HoriHeader</a></td><td>&nbsp;</td></tr>
-<tr><td><a href="#TT_VertHeader">TT_VertHeader</a></td><td><a href="#FT_PARAM_TAG_UNPATENTED_HINTING">FT_PARAM_TAG_UNPATENTED_HINTING</a></td></tr>
-<tr><td><a href="#TT_OS2">TT_OS2</a></td><td>&nbsp;</td></tr>
-<tr><td><a href="#TT_Postscript">TT_Postscript</a></td><td><a href="#TT_PLATFORM_XXX">TT_PLATFORM_XXX</a></td></tr>
-<tr><td><a href="#TT_PCLT">TT_PCLT</a></td><td><a href="#TT_APPLE_ID_XXX">TT_APPLE_ID_XXX</a></td></tr>
-<tr><td><a href="#TT_MaxProfile">TT_MaxProfile</a></td><td><a href="#TT_MAC_ID_XXX">TT_MAC_ID_XXX</a></td></tr>
-<tr><td>&nbsp;</td><td><a href="#TT_ISO_ID_XXX">TT_ISO_ID_XXX</a></td></tr>
-<tr><td><a href="#FT_Sfnt_Tag">FT_Sfnt_Tag</a></td><td><a href="#TT_MS_ID_XXX">TT_MS_ID_XXX</a></td></tr>
-<tr><td><a href="#FT_Get_Sfnt_Table">FT_Get_Sfnt_Table</a></td><td><a href="#TT_ADOBE_ID_XXX">TT_ADOBE_ID_XXX</a></td></tr>
-<tr><td><a href="#FT_Load_Sfnt_Table">FT_Load_Sfnt_Table</a></td><td><a href="#TT_MAC_LANGID_XXX">TT_MAC_LANGID_XXX</a></td></tr>
-<tr><td><a href="#FT_Sfnt_Table_Info">FT_Sfnt_Table_Info</a></td><td><a href="#TT_MS_LANGID_XXX">TT_MS_LANGID_XXX</a></td></tr>
-<tr><td>&nbsp;</td><td><a href="#TT_NAME_ID_XXX">TT_NAME_ID_XXX</a></td></tr>
-<tr><td><a href="#FT_Get_CMap_Language_ID">FT_Get_CMap_Language_ID</a></td><td><a href="#TT_UCR_XXX">TT_UCR_XXX</a></td></tr>
+<tr><td><a href="#TT_Header">TT_Header</a></td><td><a href="#FT_Load_Sfnt_Table">FT_Load_Sfnt_Table</a></td><td><a href="#TT_MAC_ID_XXX">TT_MAC_ID_XXX</a></td></tr>
+<tr><td><a href="#TT_HoriHeader">TT_HoriHeader</a></td><td><a href="#FT_Sfnt_Table_Info">FT_Sfnt_Table_Info</a></td><td><a href="#TT_ISO_ID_XXX">TT_ISO_ID_XXX</a></td></tr>
+<tr><td><a href="#TT_VertHeader">TT_VertHeader</a></td><td>&nbsp;</td><td><a href="#TT_MS_ID_XXX">TT_MS_ID_XXX</a></td></tr>
+<tr><td><a href="#TT_OS2">TT_OS2</a></td><td><a href="#FT_Get_CMap_Language_ID">FT_Get_CMap_Language_ID</a></td><td><a href="#TT_ADOBE_ID_XXX">TT_ADOBE_ID_XXX</a></td></tr>
+<tr><td><a href="#TT_Postscript">TT_Postscript</a></td><td><a href="#FT_Get_CMap_Format">FT_Get_CMap_Format</a></td><td><a href="#TT_MAC_LANGID_XXX">TT_MAC_LANGID_XXX</a></td></tr>
+<tr><td><a href="#TT_PCLT">TT_PCLT</a></td><td>&nbsp;</td><td><a href="#TT_MS_LANGID_XXX">TT_MS_LANGID_XXX</a></td></tr>
+<tr><td><a href="#TT_MaxProfile">TT_MaxProfile</a></td><td><a href="#FT_PARAM_TAG_UNPATENTED_HINTING">FT_PARAM_TAG_UNPATENTED_HINTING</a></td><td><a href="#TT_NAME_ID_XXX">TT_NAME_ID_XXX</a></td></tr>
+<tr><td>&nbsp;</td><td>&nbsp;</td><td><a href="#TT_UCR_XXX">TT_UCR_XXX</a></td></tr>
+<tr><td><a href="#FT_Sfnt_Tag">FT_Sfnt_Tag</a></td><td><a href="#TT_PLATFORM_XXX">TT_PLATFORM_XXX</a></td><td></td></tr>
+<tr><td><a href="#FT_Get_Sfnt_Table">FT_Get_Sfnt_Table</a></td><td><a href="#TT_APPLE_ID_XXX">TT_APPLE_ID_XXX</a></td><td></td></tr>
 </table>
 
 
 
 <div class="section">
 <h3 id="FT_PARAM_TAG_UNPATENTED_HINTING">FT_PARAM_TAG_UNPATENTED_HINTING</h3>
-<p>Defined in FT_UNPATENTED_HINTING_H (freetype/ttunpat.h).</p>
 <pre>
-#define <b>FT_PARAM_TAG_UNPATENTED_HINTING</b>  <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 'u', 'n', 'p', 'a' )
+#define <b>FT_PARAM_TAG_UNPATENTED_HINTING</b> \
+          <a href="ft2-basic_types.html#FT_MAKE_TAG">FT_MAKE_TAG</a>( 'u', 'n', 'p', 'a' )
 </pre>
 
-<p>Deprecated.</p>
+<p>Deprecated, no effect.</p>
 <p>Previously: A constant used as the tag of an <a href="ft2-base_interface.html#FT_Parameter">FT_Parameter</a> structure to indicate that unpatented methods only should be used by the TrueType bytecode interpreter for a typeface opened by <a href="ft2-base_interface.html#FT_Open_Face">FT_Open_Face</a>.</p>
 
 <hr>
 
 <p>Possible values of the language identifier field in the name records of the SFNT &lsquo;name&rsquo; table if the &lsquo;platform&rsquo; identifier code is <a href="ft2-truetype_tables.html#TT_PLATFORM_XXX">TT_PLATFORM_MICROSOFT</a>. These values are also used as return values for function <a href="ft2-truetype_tables.html#FT_Get_CMap_Language_ID">FT_Get_CMap_Language_ID</a>.</p>
 <p>The canonical source for Microsoft's IDs is</p>
-<p><a href="http://www.microsoft.com/globaldev/reference/lcid-all.mspx">http://www.microsoft.com/globaldev/reference/lcid-all.mspx</a> ,</p>
+<p><a href="https://www.microsoft.com/globaldev/reference/lcid-all.mspx">https://www.microsoft.com/globaldev/reference/lcid-all.mspx</a> ,</p>
 <p>however, we only provide macros for language identifiers present in the OpenType specification: Microsoft has abandoned the concept of LCIDs (language code identifiers), and format&nbsp;1 of the &lsquo;name&rsquo; table provides a better mechanism for languages not covered here.</p>
 <p>More legacy values not listed in the reference can be found in the <a href="ft2-header_file_macros.html#FT_TRUETYPE_IDS_H">FT_TRUETYPE_IDS_H</a> header file.</p>
 
index b3b905a..f9f371a 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="tt_driver">The TrueType driver</h1>
-<h2>Synopsis</h2>
-<table class="synopsis">
-<tr><td><a href="#interpreter-version">interpreter-version</a></td><td><a href="#TT_INTERPRETER_VERSION_XXX">TT_INTERPRETER_VERSION_XXX</a></td></tr>
-</table>
-
 
 <p>While FreeType's TrueType driver doesn't expose API functions by itself, it is possible to control its behaviour with <a href="ft2-module_management.html#FT_Property_Set">FT_Property_Set</a> and <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a>. The following lists the available properties together with the necessary macros and structures.</p>
 <p>The TrueType driver's module name is &lsquo;truetype&rsquo;.</p>
+<p>A single property <a href="ft2-properties.html#interpreter-version">interpreter-version</a> is available, as documented in the &lsquo;<a href="ft2-properties.html#properties">Driver properties</a>&rsquo; section.</p>
 <p>We start with a list of definitions, kindly provided by Greg Hitchcock.</p>
 <p><i>Bi-Level</i> <i>Rendering</i></p>
 <p>Monochromatic rendering, exclusively used in the early days of TrueType by both Apple and Microsoft. Microsoft's GDI interface supported hinting of the right-side bearing point, such that the advance width could be non-linear. Most often this was done to achieve some level of glyph symmetry. To enable reasonable performance (e.g., not having to run hinting on all glyphs just to get the widths) there was a bit in the head table indicating if the side bearing was hinted, and additional tables, &lsquo;hdmx&rsquo; and &lsquo;LTSH&rsquo;, to cache hinting widths across multiple sizes and device aspect ratios.</p>
 <p><i>ClearType</i> <i>Subpixel</i> <i>Positioning</i></p>
 <p>One of the nice benefits of ClearType is the ability to more crisply display fractional widths; unfortunately, the GDI model of integer bitmaps did not support this. However, the WPF and Direct Write frameworks do support fractional widths. DWrite calls this &lsquo;natural mode&rsquo;, not to be confused with GDI's &lsquo;natural widths&rsquo;. Subpixel positioning, in the current implementation of Direct Write, unfortunately does not support hinted advance widths, see <a href="http://www.beatstamm.com/typography/RTRCh4.htm#Sec22">http://www.beatstamm.com/typography/RTRCh4.htm#Sec22</a>. Note that the TrueType interpreter fully allows the advance width to be adjusted in this mode, just the DWrite client will ignore those changes.</p>
 <p><i>ClearType</i> <i>Backward</i> <i>Compatibility</i></p>
-<p>This is a set of exceptions made in the TrueType interpreter to minimize hinting techniques that were problematic with the extra resolution of ClearType; see <a href="http://www.beatstamm.com/typography/RTRCh4.htm#Sec1">http://www.beatstamm.com/typography/RTRCh4.htm#Sec1</a> and <a href="http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx">http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx</a>. This technique is not to be confused with ClearType compatible widths. ClearType backward compatibility has no direct impact on changing advance widths, but there might be an indirect impact on disabling some deltas. This could be worked around in backward compatibility mode.</p>
+<p>This is a set of exceptions made in the TrueType interpreter to minimize hinting techniques that were problematic with the extra resolution of ClearType; see <a href="http://www.beatstamm.com/typography/RTRCh4.htm#Sec1">http://www.beatstamm.com/typography/RTRCh4.htm#Sec1</a> and <a href="https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx">https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx</a>. This technique is not to be confused with ClearType compatible widths. ClearType backward compatibility has no direct impact on changing advance widths, but there might be an indirect impact on disabling some deltas. This could be worked around in backward compatibility mode.</p>
 <p><i>Native</i> <i>ClearType</i> <i>Mode</i></p>
 <p>(Not to be confused with &lsquo;natural widths&rsquo;.) This mode removes all the exceptions in the TrueType interpreter when running with ClearType. Any issues on widths would still apply, though.</p>
 
-<div class="section">
-<h3 id="interpreter-version">interpreter-version</h3>
-
-<p>Currently, three versions are available, two representing the bytecode interpreter with subpixel hinting support (old &lsquo;Infinality&rsquo; code and new stripped-down and higher performance &lsquo;minimal&rsquo; code) and one without, respectively. The default is subpixel support if TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel support otherwise (since it isn't available then).</p>
-<p>If subpixel hinting is on, many TrueType bytecode instructions behave differently compared to B/W or grayscale rendering (except if &lsquo;native ClearType&rsquo; is selected by the font). Microsoft's main idea is to render at a much increased horizontal resolution, then sampling down the created output to subpixel precision. However, many older fonts are not suited to this and must be specially taken care of by applying (hardcoded) tweaks in Microsoft's interpreter.</p>
-<p>Details on subpixel hinting and some of the necessary tweaks can be found in Greg Hitchcock's whitepaper at &lsquo;<a href="http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx">http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx</a>&rsquo;. Note that FreeType currently doesn't really &lsquo;subpixel hint&rsquo; (6x1, 6x2, or 6x5 supersampling) like discussed in the paper. Depending on the chosen interpreter, it simply ignores instructions on vertical stems to arrive at very similar results.</p>
-<p>The following example code demonstrates how to deactivate subpixel hinting (omitting the error handling).</p>
-<pre class="colored">
-  FT_Library  library;
-  FT_Face     face;
-  FT_UInt     interpreter_version = TT_INTERPRETER_VERSION_35;
-
-
-  FT_Init_FreeType( &amp;library );
-
-  FT_Property_Set( library, "truetype",
-                            "interpreter-version",
-                            &amp;interpreter_version );
-</pre>
-
-<h4>note</h4>
-<p>This property can be used with <a href="ft2-module_management.html#FT_Property_Get">FT_Property_Get</a> also.</p>
-<p>This property can be set via the &lsquo;FREETYPE_PROPERTIES&rsquo; environment variable (using values &lsquo;35&rsquo;, &lsquo;38&rsquo;, or &lsquo;40&rsquo;).</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
-<div class="section">
-<h3 id="TT_INTERPRETER_VERSION_XXX">TT_INTERPRETER_VERSION_XXX</h3>
-<p>Defined in FT_TRUETYPE_DRIVER_H (freetype/ftttdrv.h).</p>
-<pre>
-#define <a href="ft2-tt_driver.html#TT_INTERPRETER_VERSION_35">TT_INTERPRETER_VERSION_35</a>  35
-#define <a href="ft2-tt_driver.html#TT_INTERPRETER_VERSION_38">TT_INTERPRETER_VERSION_38</a>  38
-#define <a href="ft2-tt_driver.html#TT_INTERPRETER_VERSION_40">TT_INTERPRETER_VERSION_40</a>  40
-</pre>
-
-<p>A list of constants used for the <a href="ft2-tt_driver.html#interpreter-version">interpreter-version</a> property to select the hinting engine for Truetype fonts.</p>
-<p>The numeric value in the constant names represents the version number as returned by the &lsquo;GETINFO&rsquo; bytecode instruction.</p>
-
-<h4>values</h4>
-<table class="fields">
-<tr><td class="val" id="TT_INTERPRETER_VERSION_35">TT_INTERPRETER_VERSION_35</td><td class="desc">
-<p>Version&nbsp;35 corresponds to MS rasterizer v.1.7 as used e.g. in Windows&nbsp;98; only grayscale and B/W rasterizing is supported.</p>
-</td></tr>
-<tr><td class="val" id="TT_INTERPRETER_VERSION_38">TT_INTERPRETER_VERSION_38</td><td class="desc">
-<p>Version&nbsp;38 corresponds to MS rasterizer v.1.9; it is roughly equivalent to the hinting provided by DirectWrite ClearType (as can be found, for example, in the Internet Explorer&nbsp;9 running on Windows&nbsp;7). It is used in FreeType to select the &lsquo;Infinality&rsquo; subpixel hinting code. The code may be removed in a future version.</p>
-</td></tr>
-<tr><td class="val" id="TT_INTERPRETER_VERSION_40">TT_INTERPRETER_VERSION_40</td><td class="desc">
-<p>Version&nbsp;40 corresponds to MS rasterizer v.2.1; it is roughly equivalent to the hinting provided by DirectWrite ClearType (as can be found, for example, in Microsoft's Edge Browser on Windows&nbsp;10). It is used in FreeType to select the &lsquo;minimal&rsquo; subpixel hinting code, a stripped-down and higher performance version of the &lsquo;Infinality&rsquo; code.</p>
-</td></tr>
-</table>
-
-<h4>note</h4>
-<p>This property controls the behaviour of the bytecode interpreter and thus how outlines get hinted. It does <b>not</b> control how glyph get rasterized! In particular, it does not control subpixel color filtering.</p>
-<p>If FreeType has not been compiled with the configuration option TT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version&nbsp;38 or&nbsp;40 causes an &lsquo;FT_Err_Unimplemented_Feature&rsquo; error.</p>
-<p>Depending on the graphics framework, Microsoft uses different bytecode and rendering engines. As a consequence, the version numbers returned by a call to the &lsquo;GETINFO&rsquo; bytecode instruction are more convoluted than desired.</p>
-<p>Here are two tables that try to shed some light on the possible values for the MS rasterizer engine, together with the additional features introduced by it.</p>
-<pre class="colored">
-  GETINFO framework               version feature
-  -------------------------------------------------------------------
-      3   GDI (Win 3.1),            v1.0  16-bit, first version
-          TrueImage
-     33   GDI (Win NT 3.1),         v1.5  32-bit
-          HP Laserjet
-     34   GDI (Win 95)              v1.6  font smoothing,
-                                          new SCANTYPE opcode
-     35   GDI (Win 98/2000)         v1.7  (UN)SCALED_COMPONENT_OFFSET
-                                            bits in composite glyphs
-     36   MGDI (Win CE 2)           v1.6+ classic ClearType
-     37   GDI (XP and later),       v1.8  ClearType
-          GDI+ old (before Vista)
-     38   GDI+ old (Vista, Win 7),  v1.9  subpixel ClearType,
-          WPF                             Y-direction ClearType,
-                                          additional error checking
-     39   DWrite (before Win 8)     v2.0  subpixel ClearType flags
-                                            in GETINFO opcode,
-                                          bug fixes
-     40   GDI+ (after Win 7),       v2.1  Y-direction ClearType flag
-          DWrite (Win 8)                    in GETINFO opcode,
-                                          Gray ClearType
-</pre>
-<p>The &lsquo;version&rsquo; field gives a rough orientation only, since some applications provided certain features much earlier (as an example, Microsoft Reader used subpixel and Y-direction ClearType already in Windows 2000). Similarly, updates to a given framework might include improved hinting support.</p>
-<pre class="colored">
-   version   sampling          rendering        comment
-            x        y       x           y
-  --------------------------------------------------------------
-    v1.0   normal  normal  B/W           B/W    bi-level
-    v1.6   high    high    gray          gray   grayscale
-    v1.8   high    normal  color-filter  B/W    (GDI) ClearType
-    v1.9   high    high    color-filter  gray   Color ClearType
-    v2.1   high    normal  gray          B/W    Gray ClearType
-    v2.1   high    high    gray          gray   Gray ClearType
-</pre>
-<p>Color and Gray ClearType are the two available variants of &lsquo;Y-direction ClearType&rsquo;, meaning grayscale rasterization along the Y-direction; the name used in the TrueType specification for this feature is &lsquo;symmetric smoothing&rsquo;. &lsquo;Classic ClearType&rsquo; is the original algorithm used before introducing a modified version in Win&nbsp;XP. Another name for v1.6's grayscale rendering is &lsquo;font smoothing&rsquo;, and &lsquo;Color ClearType&rsquo; is sometimes also called &lsquo;DWrite ClearType&rsquo;. To differentiate between today's Color ClearType and the earlier ClearType variant with B/W rendering along the vertical axis, the latter is sometimes called &lsquo;GDI ClearType&rsquo;.</p>
-<p>&lsquo;Normal&rsquo; and &lsquo;high&rsquo; sampling describe the (virtual) resolution to access the rasterized outline after the hinting process. &lsquo;Normal&rsquo; means 1 sample per grid line (i.e., B/W). In the current Microsoft implementation, &lsquo;high&rsquo; means an extra virtual resolution of 16x16 (or 16x1) grid lines per pixel for bytecode instructions like &lsquo;MIRP&rsquo;. After hinting, these 16 grid lines are mapped to 6x5 (or 6x1) grid lines for color filtering if Color ClearType is activated.</p>
-<p>Note that &lsquo;Gray ClearType&rsquo; is essentially the same as v1.6's grayscale rendering. However, the GETINFO instruction handles it differently: v1.6 returns bit&nbsp;12 (hinting for grayscale), while v2.1 returns bits&nbsp;13 (hinting for ClearType), 18 (symmetrical smoothing), and&nbsp;19 (Gray ClearType). Also, this mode respects bits 2 and&nbsp;3 for the version&nbsp;1 gasp table exclusively (like Color ClearType), while v1.6 only respects the values of version&nbsp;0 (bits 0 and&nbsp;1).</p>
-<p>Keep in mind that the features of the above interpreter versions might not map exactly to FreeType features or behavior because it is a fundamentally different library with different internals.</p>
-
-<hr>
-<table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
-
 </body>
 </html>
index a7bd0ac..dda179c 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="type1_tables">Type 1 Tables</h1>
 <h2>Synopsis</h2>
 <p>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.</p>
 <p>If the font's format is not PostScript-based, this function returns the &lsquo;FT_Err_Invalid_Argument&rsquo; error code.</p>
 
+<h4>since</h4>
+<p>2.4.8</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 </td></tr>
 </table>
 
+<h4>since</h4>
+<p>2.4.8</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
 </td></tr>
 </table>
 
+<h4>since</h4>
+<p>2.4.8</p>
+
 <hr>
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="middle">[<a href="#">Top</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table></div>
 
index 52d05f6..30cd264 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="user_allocation">User allocation</h1>
 
index 5982f60..d2926fb 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="version">FreeType Version</h1>
 <h2>Synopsis</h2>
 <p>Defined in FT_FREETYPE_H (freetype/freetype.h).</p>
 <pre>
 #define <a href="ft2-version.html#FREETYPE_MAJOR">FREETYPE_MAJOR</a>  2
-#define <a href="ft2-version.html#FREETYPE_MINOR">FREETYPE_MINOR</a>  8
+#define <a href="ft2-version.html#FREETYPE_MINOR">FREETYPE_MINOR</a>  9
 #define <a href="ft2-version.html#FREETYPE_PATCH">FREETYPE_PATCH</a>  0
 </pre>
 
index be2a6a0..f058df8 100644 (file)
@@ -1,9 +1,9 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-"http://www.w3.org/TR/html4/loose.dtd">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<title>FreeType-2.8 API Reference</title>
+<title>FreeType-2.9 API Reference</title>
 <style type="text/css">
   a:link { color: #0000EF; }
   a:visited { color: #51188E; }
 <body>
 
 <table class="index-toc-link"><tr><td class="left">[<a href="ft2-index.html">Index</a>]</td><td class="right">[<a href="ft2-toc.html">TOC</a>]</td></tr></table>
-<h1>FreeType-2.8 API Reference</h1>
+<h1>FreeType-2.9 API Reference</h1>
 
 <h1 id="winfnt_fonts">Window FNT Files</h1>
 <h2>Synopsis</h2>
 <p>Mac Roman encoding.</p>
 </td></tr>
 <tr><td class="val" id="FT_WinFNT_ID_OEM">FT_WinFNT_ID_OEM</td><td class="desc">
-<p>From Michael Pöttgen &lt;michael@poettgen.de&gt;:</p>
+<p>From Michael Poettgen &lt;michael@poettgen.de&gt;:</p>
 <p>The &lsquo;Windows Font Mapping&rsquo; article says that FT_WinFNT_ID_OEM is used for the charset of vector fonts, like &lsquo;modern.fon&rsquo;, &lsquo;roman.fon&rsquo;, and &lsquo;script.fon&rsquo; on Windows.</p>
 <p>The &lsquo;CreateFont&rsquo; documentation says: The FT_WinFNT_ID_OEM value specifies a character set that is operating-system dependent.</p>
 <p>The &lsquo;IFIMETRICS&rsquo; documentation from the &lsquo;Windows Driver Development Kit&rsquo; says: This font supports an OEM-specific character set. The OEM character set is system dependent.</p>
index f07b067..44b4cb1 100644 (file)
@@ -189,7 +189,7 @@ How to prepare a new release
 
 ----------------------------------------------------------------------
 
-Copyright 2003-2017 by
+Copyright 2003-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
index 889aebf..f539e9a 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    ANSI-specific configuration file (specification only).               */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -73,11 +73,11 @@ FT_BEGIN_HEADER
 
   /* The size of an `int' type.  */
 #if                                 FT_UINT_MAX == 0xFFFFUL
-#define FT_SIZEOF_INT  (16 / FT_CHAR_BIT)
+#define FT_SIZEOF_INT  ( 16 / FT_CHAR_BIT )
 #elif                               FT_UINT_MAX == 0xFFFFFFFFUL
-#define FT_SIZEOF_INT  (32 / FT_CHAR_BIT)
+#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)
+#define FT_SIZEOF_INT  ( 64 / FT_CHAR_BIT )
 #else
 #error "Unsupported size of `int' type!"
 #endif
@@ -85,11 +85,11 @@ FT_BEGIN_HEADER
   /* 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)
+#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)
+#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)
+#define FT_SIZEOF_LONG  ( 64 / FT_CHAR_BIT )
 #else
 #error "Unsupported size of `long' type!"
 #endif
@@ -236,12 +236,12 @@ FT_BEGIN_HEADER
 
 #endif
 
-#if FT_SIZEOF_INT == (32 / FT_CHAR_BIT)
+#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)
+#elif FT_SIZEOF_LONG == ( 32 / FT_CHAR_BIT )
 
   typedef signed long     FT_Int32;
   typedef unsigned long   FT_UInt32;
@@ -252,12 +252,12 @@ FT_BEGIN_HEADER
 
 
   /* look up an integer type that is at least 32 bits */
-#if FT_SIZEOF_INT >= (32 / FT_CHAR_BIT)
+#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)
+#elif FT_SIZEOF_LONG >= ( 32 / FT_CHAR_BIT )
 
   typedef long           FT_Fast;
   typedef unsigned long  FT_UFast;
@@ -267,7 +267,7 @@ FT_BEGIN_HEADER
 
   /* determine whether we have a 64-bit int type for platforms without */
   /* Autoconf                                                          */
-#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)
+#if FT_SIZEOF_LONG == ( 64 / FT_CHAR_BIT )
 
   /* FT_LONG64 must be defined if a 64-bit type is available */
 #define FT_LONG64
@@ -365,6 +365,14 @@ FT_BEGIN_HEADER
 #endif
 
 
+  /* Use FT_LOCAL and FT_LOCAL_DEF to declare and define, respectively, */
+  /* a function that gets used only within the scope of a module.       */
+  /* Normally, both the header and source code files for such a         */
+  /* function are within a single module directory.                     */
+  /*                                                                    */
+  /* Intra-module arrays should be tagged with FT_LOCAL_ARRAY and       */
+  /* FT_LOCAL_ARRAY_DEF.                                                */
+  /*                                                                    */
 #ifdef FT_MAKE_OPTION_SINGLE_OBJECT
 
 #define FT_LOCAL( x )      static  x
@@ -386,6 +394,12 @@ FT_BEGIN_HEADER
 #define FT_LOCAL_ARRAY_DEF( x )  const  x
 
 
+  /* Use FT_BASE and FT_BASE_DEF to declare and define, respectively, */
+  /* functions that are used in more than a single module.  In the    */
+  /* current setup this implies that the declaration is in a header   */
+  /* file in the `include/freetype/internal' directory, and the       */
+  /* function body is in a file in `src/base'.                        */
+  /*                                                                  */
 #ifndef FT_BASE
 
 #ifdef __cplusplus
@@ -408,6 +422,37 @@ FT_BEGIN_HEADER
 #endif /* !FT_BASE_DEF */
 
 
+  /*   When compiling FreeType as a DLL, some systems/compilers need a     */
+  /*   special attribute 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.                                     */
+  /*                                                                       */
+  /*   To export a variable, use FT_EXPORT_VAR.                            */
+  /*                                                                       */
 #ifndef FT_EXPORT
 
 #ifdef __cplusplus
@@ -416,6 +461,15 @@ FT_BEGIN_HEADER
 #define FT_EXPORT( x )  extern  x
 #endif
 
+#ifdef _MSC_VER
+#undef FT_EXPORT
+#ifdef _DLL
+#define FT_EXPORT( x )  __declspec( dllexport )  x
+#else
+#define FT_EXPORT( x )  __declspec( dllimport )  x
+#endif
+#endif
+
 #endif /* !FT_EXPORT */
 
 
@@ -440,6 +494,7 @@ FT_BEGIN_HEADER
 
 #endif /* !FT_EXPORT_VAR */
 
+
   /* The following macros are needed to compile the library with a   */
   /* C++ compiler and with 16bit compilers.                          */
   /*                                                                 */
@@ -451,7 +506,13 @@ FT_BEGIN_HEADER
   /* functions which are accessed by (global) function pointers.     */
   /*                                                                 */
   /*                                                                 */
-  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */
+  /* FT_CALLBACK_DEF is used to _define_ a callback function,        */
+  /* located in the same source code file as the structure that uses */
+  /* it.                                                             */
+  /*                                                                 */
+  /* FT_BASE_CALLBACK and FT_BASE_CALLBACK_DEF are used to declare   */
+  /* and define a callback function, respectively, in a similar way  */
+  /* as FT_BASE and FT_BASE_DEF work.                                */
   /*                                                                 */
   /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
   /* contains pointers to callback functions.                        */
@@ -471,6 +532,16 @@ FT_BEGIN_HEADER
 #endif
 #endif /* FT_CALLBACK_DEF */
 
+#ifndef FT_BASE_CALLBACK
+#ifdef __cplusplus
+#define FT_BASE_CALLBACK( x )      extern "C"  x
+#define FT_BASE_CALLBACK_DEF( x )  extern "C"  x
+#else
+#define FT_BASE_CALLBACK( x )      extern  x
+#define FT_BASE_CALLBACK_DEF( x )  x
+#endif
+#endif /* FT_BASE_CALLBACK */
+
 #ifndef FT_CALLBACK_TABLE
 #ifdef __cplusplus
 #define FT_CALLBACK_TABLE      extern "C"
index d491af5..702f77c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Build macros of the FreeType 2 library.                              */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
   /*************************************************************************
    *
    * @macro:
+   *   FT_DRIVER_H
+   *
+   * @description:
+   *   A macro used in #include statements to name the file containing
+   *   structures and macros related to the driver modules.
+   *
+   */
+#define FT_DRIVER_H  <freetype/ftdriver.h>
+
+
+  /*************************************************************************
+   *
+   * @macro:
    *   FT_AUTOHINTER_H
    *
    * @description:
    *   A macro used in #include statements to name the file containing
    *   structures and macros related to the auto-hinting module.
    *
+   *   Deprecated since version 2.9; use @FT_DRIVER_H instead.
+   *
    */
-#define FT_AUTOHINTER_H  <freetype/ftautoh.h>
+#define FT_AUTOHINTER_H  FT_DRIVER_H
 
 
   /*************************************************************************
    *   A macro used in #include statements to name the file containing
    *   structures and macros related to the CFF driver module.
    *
+   *   Deprecated since version 2.9; use @FT_DRIVER_H instead.
+   *
    */
-#define FT_CFF_DRIVER_H  <freetype/ftcffdrv.h>
+#define FT_CFF_DRIVER_H  FT_DRIVER_H
 
 
   /*************************************************************************
    *   A macro used in #include statements to name the file containing
    *   structures and macros related to the TrueType driver module.
    *
+   *   Deprecated since version 2.9; use @FT_DRIVER_H instead.
+   *
    */
-#define FT_TRUETYPE_DRIVER_H  <freetype/ftttdrv.h>
+#define FT_TRUETYPE_DRIVER_H  FT_DRIVER_H
 
 
   /*************************************************************************
    *   A macro used in #include statements to name the file containing
    *   structures and macros related to the PCF driver module.
    *
+   *   Deprecated since version 2.9; use @FT_DRIVER_H instead.
+   *
    */
-#define FT_PCF_DRIVER_H  <freetype/ftpcfdrv.h>
+#define FT_PCF_DRIVER_H  FT_DRIVER_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:
   /*************************************************************************
    *
    * @macro:
-   *   FT_UNPATENTED_HINTING_H
-   *
-   * @description:
-   *   Deprecated.
-   */
-#define FT_UNPATENTED_HINTING_H  <freetype/ttunpat.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
    *   FT_INCREMENTAL_H
    *
    * @description:
 
   /* */
 
+  /* These header files don't need to be included by the user. */
 #define FT_ERROR_DEFINITIONS_H  <freetype/fterrdef.h>
+#define FT_PARAMETER_TAGS_H     <freetype/ftparams.h>
 
+  /* Deprecated macros. */
+#define FT_UNPATENTED_HINTING_H   <freetype/ftparams.h>
+#define FT_TRUETYPE_UNPATENTED_H  <freetype/ftparams.h>
+
+  /* FT_CACHE_H is the only header file needed for the cache subsystem. */
+#define FT_CACHE_IMAGE_H          FT_CACHE_H
+#define FT_CACHE_SMALL_BITMAPS_H  FT_CACHE_H
+#define FT_CACHE_CHARMAP_H        FT_CACHE_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>
+#define FT_CACHE_MANAGER_H           FT_CACHE_H
+#define FT_CACHE_INTERNAL_MRU_H      FT_CACHE_H
+#define FT_CACHE_INTERNAL_MANAGER_H  FT_CACHE_H
+#define FT_CACHE_INTERNAL_CACHE_H    FT_CACHE_H
+#define FT_CACHE_INTERNAL_GLYPH_H    FT_CACHE_H
+#define FT_CACHE_INTERNAL_IMAGE_H    FT_CACHE_H
+#define FT_CACHE_INTERNAL_SBITS_H    FT_CACHE_H
 
 
   /*
index 1bf6e8f..a5cb7ff 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    User-selectable configuration macros (specification only).           */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -75,19 +75,17 @@ FT_BEGIN_HEADER
   /*************************************************************************/
 
 
-  /*************************************************************************/
+  /*#***********************************************************************/
   /*                                                                       */
   /* If you enable this configuration option, FreeType recognizes an       */
   /* environment variable called `FREETYPE_PROPERTIES', which can be used  */
   /* to control the various font drivers and modules.  The controllable    */
-  /* properties are listed in the section `Controlling FreeType Modules'   */
-  /* in the reference's table of contents; currently there are properties  */
-  /* for the auto-hinter (file `ftautoh.h'), CFF (file `ftcffdrv.h'),      */
-  /* TrueType (file `ftttdrv.h'), and PCF (file `ftpcfdrv.h').             */
+  /* properties are listed in the section @properties.                     */
   /*                                                                       */
   /* `FREETYPE_PROPERTIES' has the following syntax form (broken here into */
   /* multiple lines for better readability).                               */
   /*                                                                       */
+  /* {                                                                     */
   /*   <optional whitespace>                                               */
   /*   <module-name1> ':'                                                  */
   /*   <property-name1> '=' <property-value1>                              */
@@ -95,6 +93,7 @@ FT_BEGIN_HEADER
   /*   <module-name2> ':'                                                  */
   /*   <property-name2> '=' <property-value2>                              */
   /*   ...                                                                 */
+  /* }                                                                     */
   /*                                                                       */
   /* Example:                                                              */
   /*                                                                       */
@@ -107,20 +106,17 @@ FT_BEGIN_HEADER
 
   /*************************************************************************/
   /*                                                                       */
-  /* 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.    */
+  /* Uncomment the line below if you want to activate LCD rendering        */
+  /* technology similar to ClearType in this build of the library.  This   */
+  /* technology triples the resolution in the direction color subpixels.   */
+  /* To mitigate color fringes inherent to this technology, you also need  */
+  /* to explicitly set up LCD filtering.                                   */
   /*                                                                       */
   /* 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.                */
+  /* When this macro is not defined, FreeType offers alternative LCD       */
+  /* rendering technology that produces excellent output without LCD       */
+  /* filtering.                                                            */
   /*                                                                       */
 /* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
 
@@ -214,6 +210,10 @@ FT_BEGIN_HEADER
   /*   Do not #undef this macro here since the build system might define   */
   /*   it for certain configurations only.                                 */
   /*                                                                       */
+  /*   If you use a build system like cmake or the `configure' script,     */
+  /*   options set by those programs have precendence, overwriting the     */
+  /*   value here with the configured one.                                 */
+  /*                                                                       */
 /* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */
 
 
@@ -230,6 +230,10 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /*   Define this macro if you want to enable this `feature'.             */
   /*                                                                       */
+  /*   If you use a build system like cmake or the `configure' script,     */
+  /*   options set by those programs have precendence, overwriting the     */
+  /*   value here with the configured one.                                 */
+  /*                                                                       */
 /* #define FT_CONFIG_OPTION_USE_BZIP2 */
 
 
@@ -255,6 +259,10 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /*   Define this macro if you want to enable this `feature'.             */
   /*                                                                       */
+  /*   If you use a build system like cmake or the `configure' script,     */
+  /*   options set by those programs have precendence, overwriting the     */
+  /*   value here with the configured one.                                 */
+  /*                                                                       */
 /* #define FT_CONFIG_OPTION_USE_PNG */
 
 
@@ -268,49 +276,11 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /*   Define this macro if you want to enable this `feature'.             */
   /*                                                                       */
-/* #define FT_CONFIG_OPTION_USE_HARFBUZZ */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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 );                    */
+  /*   If you use a build system like cmake or the `configure' script,     */
+  /*   options set by those programs have precendence, overwriting the     */
+  /*   value here with the configured one.                                 */
   /*                                                                       */
-  /*                                                                       */
-  /*     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 */
+/* #define FT_CONFIG_OPTION_USE_HARFBUZZ */
 
 
   /*************************************************************************/
@@ -327,7 +297,7 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /*   - The TrueType driver will provide its own set of glyph names,      */
   /*     if you build it to support postscript names in the TrueType       */
-  /*     `post' table.                                                     */
+  /*     `post' table, but will not synthesize a missing Unicode charmap.  */
   /*                                                                       */
   /*   - The Type 1 driver will not be able to synthesize a Unicode        */
   /*     charmap out of the glyphs found in the fonts.                     */
@@ -681,7 +651,7 @@ FT_BEGIN_HEADER
   /* This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be      */
   /* defined.                                                              */
   /*                                                                       */
-  /* [1] http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */
+  /* [1] https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */
   /*                                                                       */
 /* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING  1         */
 #define TT_CONFIG_OPTION_SUBPIXEL_HINTING  2
@@ -701,7 +671,7 @@ FT_BEGIN_HEADER
   /* composite flags array which can be used to disambiguate, but old      */
   /* fonts will not have them.                                             */
   /*                                                                       */
-  /*   http://www.microsoft.com/typography/otspec/glyf.htm                 */
+  /*   https://www.microsoft.com/typography/otspec/glyf.htm                */
   /*   https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html */
   /*                                                                       */
 #undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
@@ -799,6 +769,16 @@ FT_BEGIN_HEADER
 
 
   /*************************************************************************/
+  /*                                                                       */
+  /* T1_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe Type 1     */
+  /* engine gets compiled into FreeType.  If defined, it is possible to    */
+  /* switch between the two engines using the `hinting-engine' property of */
+  /* the type1 driver module.                                              */
+  /*                                                                       */
+/* #define T1_CONFIG_OPTION_OLD_ENGINE */
+
+
+  /*************************************************************************/
   /*************************************************************************/
   /****                                                                 ****/
   /****         C F F   D R I V E R    C O N F I G U R A T I O N        ****/
@@ -813,8 +793,8 @@ FT_BEGIN_HEADER
   /* possible to set up the default values of the four control points that */
   /* define the stem darkening behaviour of the (new) CFF engine.  For     */
   /* more details please read the documentation of the                     */
-  /* `darkening-parameters' property of the cff driver module (file        */
-  /* `ftcffdrv.h'), which allows the control at run-time.                  */
+  /* `darkening-parameters' property (file `ftdriver.h'), which allows the */
+  /* control at run-time.                                                  */
   /*                                                                       */
   /* Do *not* undefine these macros!                                       */
   /*                                                                       */
@@ -902,7 +882,7 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /* This experimental option is active only if the rendering mode is      */
   /* FT_RENDER_MODE_LIGHT; you can switch warping on and off with the      */
-  /* `warping' property of the auto-hinter (see file `ftautoh.h' for more  */
+  /* `warping' property of the auto-hinter (see file `ftdriver.h' for more */
   /* information; by default it is switched off).                          */
   /*                                                                       */
 #define AF_CONFIG_OPTION_USE_WARPER
index 05a4845..42f9a06 100644 (file)
@@ -5,7 +5,7 @@
 /*    ANSI-specific library and header configuration file (specification   */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 2989fbb..eda95e2 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType high-level API and common types (specification only).       */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -138,6 +138,7 @@ FT_BEGIN_HEADER
   /*    FT_FACE_FLAG_TRICKY                                                */
   /*    FT_FACE_FLAG_KERNING                                               */
   /*    FT_FACE_FLAG_MULTIPLE_MASTERS                                      */
+  /*    FT_FACE_FLAG_VARIATION                                             */
   /*    FT_FACE_FLAG_GLYPH_NAMES                                           */
   /*    FT_FACE_FLAG_EXTERNAL_STREAM                                       */
   /*    FT_FACE_FLAG_HINTER                                                */
@@ -147,14 +148,16 @@ FT_BEGIN_HEADER
   /*    FT_HAS_KERNING                                                     */
   /*    FT_HAS_FIXED_SIZES                                                 */
   /*    FT_HAS_GLYPH_NAMES                                                 */
-  /*    FT_HAS_MULTIPLE_MASTERS                                            */
   /*    FT_HAS_COLOR                                                       */
+  /*    FT_HAS_MULTIPLE_MASTERS                                            */
   /*                                                                       */
   /*    FT_IS_SFNT                                                         */
   /*    FT_IS_SCALABLE                                                     */
   /*    FT_IS_FIXED_WIDTH                                                  */
   /*    FT_IS_CID_KEYED                                                    */
   /*    FT_IS_TRICKY                                                       */
+  /*    FT_IS_NAMED_INSTANCE                                               */
+  /*    FT_IS_VARIATION                                                    */
   /*                                                                       */
   /*    FT_STYLE_FLAG_BOLD                                                 */
   /*    FT_STYLE_FLAG_ITALIC                                               */
@@ -575,7 +578,8 @@ FT_BEGIN_HEADER
   /* <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.                           */
+  /*    the list and automatically activates it.  If there is no Unicode   */
+  /*    charmap, FreeType doesn't set an `active' charmap.                 */
   /*                                                                       */
   /* <Also>                                                                */
   /*    See @FT_CharMapRec for the publicly accessible fields of a given   */
@@ -647,7 +651,7 @@ FT_BEGIN_HEADER
   /*    FT_ENCODING_MS_SYMBOL ::                                           */
   /*      Microsoft Symbol encoding, used to encode mathematical symbols   */
   /*      and wingdings.  For more information, see                        */
-  /*      `http://www.microsoft.com/typography/otspec/recom.htm',          */
+  /*      `https://www.microsoft.com/typography/otspec/recom.htm',         */
   /*      `http://www.kostis.net/charsets/symbol.htm', and                 */
   /*      `http://www.kostis.net/charsets/wingding.htm'.                   */
   /*                                                                       */
@@ -656,7 +660,7 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /*    FT_ENCODING_SJIS ::                                                */
   /*      Shift JIS encoding for Japanese.  More info at                   */
-  /*      `http://en.wikipedia.org/wiki/Shift_JIS'.  See note on           */
+  /*      `https://en.wikipedia.org/wiki/Shift_JIS'.  See note on          */
   /*      multi-byte encodings below.                                      */
   /*                                                                       */
   /*    FT_ENCODING_PRC ::                                                 */
@@ -672,7 +676,7 @@ FT_BEGIN_HEADER
   /*      Corresponds to the Korean encoding system known as Extended      */
   /*      Wansung (MS Windows code page 949).                              */
   /*      For more information see                                         */
-  /*      `http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit949.txt'. */
+  /*      `https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit949.txt'. */
   /*                                                                       */
   /*    FT_ENCODING_JOHAB ::                                               */
   /*      The Korean standard character set (KS~C 5601-1992), which        */
@@ -748,7 +752,7 @@ FT_BEGIN_HEADER
   /*    @FT_Get_CMap_Language_ID to query the Mac language ID that may     */
   /*    be needed to be able to distinguish Apple encoding variants.  See  */
   /*                                                                       */
-  /*      http://www.unicode.org/Public/MAPPINGS/VENDORS/APPLE/Readme.txt  */
+  /*      https://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.     */
@@ -887,34 +891,41 @@ FT_BEGIN_HEADER
   /*                           are set to~0 if there is only one face in   */
   /*                           the font file.                              */
   /*                                                                       */
-  /*                           Bits 16-30 are relevant to GX and OpenType  */
-  /*                           variation fonts only, holding the named     */
-  /*                           instance index for the current face index   */
-  /*                           (starting with value~1; value~0 indicates   */
-  /*                           font access without a named instance).  For */
-  /*                           non-variation fonts, bits 16-30 are         */
-  /*                           ignored.  If we have the third named        */
-  /*                           instance of face~4, say, `face_index' is    */
-  /*                           set to 0x00030004.                          */
+  /*                           [Since 2.6.1] Bits 16-30 are relevant to GX */
+  /*                           and OpenType variation fonts only, holding  */
+  /*                           the named instance index for the current    */
+  /*                           face index (starting with value~1; value~0  */
+  /*                           indicates font access without a named       */
+  /*                           instance).  For non-variation fonts, bits   */
+  /*                           16-30 are ignored.  If we have the third    */
+  /*                           named instance of face~4, say, `face_index' */
+  /*                           is set to 0x00030004.                       */
   /*                                                                       */
   /*                           Bit 31 is always zero (this is,             */
   /*                           `face_index' is always a positive value).   */
   /*                                                                       */
+  /*                           [Since 2.9] Changing the design coordinates */
+  /*                           with @FT_Set_Var_Design_Coordinates or      */
+  /*                           @FT_Set_Var_Blend_Coordinates does not      */
+  /*                           influence the named instance index value    */
+  /*                           (only @FT_Set_Named_Instance does that).    */
+  /*                                                                       */
   /*    face_flags          :: A set of bit flags that give important      */
   /*                           information about the face; see             */
   /*                           @FT_FACE_FLAG_XXX for the details.          */
   /*                                                                       */
   /*    style_flags         :: The lower 16~bits contain a set of bit      */
   /*                           flags indicating the style of the face; see */
-  /*                           @FT_STYLE_FLAG_XXX for the details.  Bits   */
-  /*                           16-30 hold the number of named instances    */
-  /*                           available for the current face if we have a */
-  /*                           GX or OpenType variation (sub)font.  Bit 31 */
-  /*                           is always zero (this is, `style_flags' is   */
-  /*                           always a positive value).  Note that a      */
-  /*                           variation font has always at least one      */
-  /*                           named instance, namely the default          */
-  /*                           instance.                                   */
+  /*                           @FT_STYLE_FLAG_XXX for the details.         */
+  /*                                                                       */
+  /*                           [Since 2.6.1] Bits 16-30 hold the number    */
+  /*                           of named instances available for the        */
+  /*                           current face if we have a GX or OpenType    */
+  /*                           variation (sub)font.  Bit 31 is always zero */
+  /*                           (this is, `style_flags' is always a         */
+  /*                           positive value).  Note that a variation     */
+  /*                           font has always at least one named          */
+  /*                           instance, namely the default instance.      */
   /*                                                                       */
   /*    num_glyphs          :: The number of glyphs in the face.  If the   */
   /*                           face is scalable and has sbits (see         */
@@ -1051,6 +1062,9 @@ FT_BEGIN_HEADER
   /*    `descender', `height', `underline_position', and                   */
   /*    `underline_thickness'.                                             */
   /*                                                                       */
+  /*    Especially for TrueType fonts see also the documentation for       */
+  /*    @FT_Size_Metrics.                                                  */
+  /*                                                                       */
   typedef struct  FT_FaceRec_
   {
     FT_Long           num_faces;
@@ -1211,8 +1225,15 @@ FT_BEGIN_HEADER
   /*      tricky fonts; they are hard-coded in file `ttobjs.c'.            */
   /*                                                                       */
   /*    FT_FACE_FLAG_COLOR ::                                              */
-  /*      The face has color glyph tables.  To access color glyphs use     */
-  /*      @FT_LOAD_COLOR.                                                  */
+  /*      [Since 2.5.1] The face has color glyph tables.  To access color  */
+  /*      glyphs use @FT_LOAD_COLOR.                                       */
+  /*                                                                       */
+  /*    FT_FACE_FLAG_VARIATION ::                                          */
+  /*      [Since 2.9] Set if the current face (or named instance) has been */
+  /*      altered with @FT_Set_MM_Design_Coordinates,                      */
+  /*      @FT_Set_Var_Design_Coordinates, or                               */
+  /*      @FT_Set_Var_Blend_Coordinates.  This flag is unset by a call to  */
+  /*      @FT_Set_Named_Instance.                                          */
   /*                                                                       */
 #define FT_FACE_FLAG_SCALABLE          ( 1L <<  0 )
 #define FT_FACE_FLAG_FIXED_SIZES       ( 1L <<  1 )
@@ -1229,6 +1250,7 @@ FT_BEGIN_HEADER
 #define FT_FACE_FLAG_CID_KEYED         ( 1L << 12 )
 #define FT_FACE_FLAG_TRICKY            ( 1L << 13 )
 #define FT_FACE_FLAG_COLOR             ( 1L << 14 )
+#define FT_FACE_FLAG_VARIATION         ( 1L << 15 )
 
 
   /*************************************************************************
@@ -1390,6 +1412,14 @@ FT_BEGIN_HEADER
    *   A macro that returns true whenever a face object is a named instance
    *   of a GX or OpenType variation font.
    *
+   *   [Since 2.9] Changing the design coordinates with
+   *   @FT_Set_Var_Design_Coordinates or @FT_Set_Var_Blend_Coordinates does
+   *   not influence the return value of this macro (only
+   *   @FT_Set_Named_Instance does that).
+   *
+   * @since:
+   *   2.7
+   *
    */
 #define FT_IS_NAMED_INSTANCE( face ) \
           ( (face)->face_index & 0x7FFF0000L )
@@ -1398,6 +1428,24 @@ FT_BEGIN_HEADER
   /*************************************************************************
    *
    * @macro:
+   *   FT_IS_VARIATION( face )
+   *
+   * @description:
+   *   A macro that returns true whenever a face object has been altered
+   *   by @FT_Set_MM_Design_Coordinates, @FT_Set_Var_Design_Coordinates, or
+   *   @FT_Set_Var_Blend_Coordinates.
+   *
+   * @since:
+   *   2.9
+   *
+   */
+#define FT_IS_VARIATION( face ) \
+          ( (face)->face_flags & FT_FACE_FLAG_VARIATION )
+
+
+  /*************************************************************************
+   *
+   * @macro:
    *   FT_IS_CID_KEYED( face )
    *
    * @description:
@@ -1436,6 +1484,9 @@ FT_BEGIN_HEADER
    *   A macro that returns true whenever a face object contains
    *   tables for color glyphs.
    *
+   * @since:
+   *   2.5.1
+   *
    */
 #define FT_HAS_COLOR( face ) \
           ( (face)->face_flags & FT_FACE_FLAG_COLOR )
@@ -1529,7 +1580,13 @@ FT_BEGIN_HEADER
   /*    values of the corresponding fields in @FT_FaceRec.  Some values    */
   /*    like ascender or descender are rounded for historical reasons;     */
   /*    more precise values (for outline fonts) can be derived by scaling  */
-  /*    the corresponding @FT_FaceRec values manually.                     */
+  /*    the corresponding @FT_FaceRec values manually, with code similar   */
+  /*    to the following.                                                  */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      scaled_ascender = FT_MulFix( face->ascender,                     */
+  /*                                   size_metrics->y_scale );            */
+  /*    }                                                                  */
   /*                                                                       */
   /*    Note that due to glyph hinting and the selected rendering mode     */
   /*    these values are usually not exact; consequently, they must be     */
@@ -1541,6 +1598,43 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /*    The `FT_Size_Metrics' structure is valid for bitmap fonts also.    */
   /*                                                                       */
+  /*                                                                       */
+  /*    *TrueType* *fonts* *with* *native* *bytecode* *hinting*            */
+  /*                                                                       */
+  /*    All applications that handle TrueType fonts with native hinting    */
+  /*    must be aware that TTFs expect different rounding of vertical font */
+  /*    dimensions.  The application has to cater for this, especially if  */
+  /*    it wants to rely on a TTF's vertical data (for example, to         */
+  /*    properly align box characters vertically).                         */
+  /*                                                                       */
+  /*    Only the application knows _in_ _advance_ that it is going to use  */
+  /*    native hinting for TTFs!  FreeType, on the other hand, selects the */
+  /*    hinting mode not at the time of creating an @FT_Size object but    */
+  /*    much later, namely while calling @FT_Load_Glyph.                   */
+  /*                                                                       */
+  /*    Here is some pseudo code that illustrates a possible solution.     */
+  /*                                                                       */
+  /*    {                                                                  */
+  /*      font_format = FT_Get_Font_Format( face );                        */
+  /*                                                                       */
+  /*      if ( !strcmp( font_format, "TrueType" ) &&                       */
+  /*           do_native_bytecode_hinting         )                        */
+  /*      {                                                                */
+  /*        ascender  = ROUND( FT_MulFix( face->ascender,                  */
+  /*                                      size_metrics->y_scale ) );       */
+  /*        descender = ROUND( FT_MulFix( face->descender,                 */
+  /*                                      size_metrics->y_scale ) );       */
+  /*      }                                                                */
+  /*      else                                                             */
+  /*      {                                                                */
+  /*        ascender  = size_metrics->ascender;                            */
+  /*        descender = size_metrics->descender;                           */
+  /*      }                                                                */
+  /*                                                                       */
+  /*      height      = size_metrics->height;                              */
+  /*      max_advance = size_metrics->max_advance;                         */
+  /*    }                                                                  */
+  /*                                                                       */
   typedef struct  FT_Size_Metrics_
   {
     FT_UShort  x_ppem;      /* horizontal pixels per EM               */
@@ -1682,17 +1776,13 @@ FT_BEGIN_HEADER
   /*                         @FT_GLYPH_FORMAT_COMPOSITE, but other values  */
   /*                         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            :: This field is used as a bitmap descriptor.    */
+  /*                         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       :: The bitmap's left bearing expressed in        */
-  /*                         integer pixels.  Only valid if the format is  */
-  /*                         @FT_GLYPH_FORMAT_BITMAP, this is, if the      */
-  /*                         glyph slot contains a bitmap.                 */
+  /*                         integer pixels.                               */
   /*                                                                       */
   /*    bitmap_top        :: The bitmap's top bearing expressed in integer */
   /*                         pixels.  This is the distance from the        */
@@ -1739,7 +1829,9 @@ FT_BEGIN_HEADER
   /*    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).                                                          */
+  /*    formats).  [Since 2.9] The prospective bitmap metrics are          */
+  /*    calculated according to @FT_LOAD_TARGET_XXX and other flags even   */
+  /*    for the outline glyph, even if @FT_LOAD_RENDER is not set.         */
   /*                                                                       */
   /*    This image can later be converted into a bitmap by calling         */
   /*    @FT_Render_Glyph.  This function searches the current renderer for */
@@ -1774,7 +1866,7 @@ FT_BEGIN_HEADER
   /*         and add it to `origin_x'>                                     */
   /*                                                                       */
   /*        origin_x += slot->advance.x;                                   */
-  /*        origin_x += slot->rsb_delta - slot->lsb_relta;                 */
+  /*        origin_x += slot->rsb_delta - slot->lsb_delta;                 */
   /*      endfor                                                           */
   /*    }                                                                  */
   /*                                                                       */
@@ -1794,9 +1886,9 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /*        <load glyph with `FT_Load_Glyph'>                              */
   /*                                                                       */
-  /*        if ( prev_rsb_delta - slot->lsb_delta >= 32 )                  */
+  /*        if ( prev_rsb_delta - slot->lsb_delta >  32 )                  */
   /*          origin_x -= 64;                                              */
-  /*        else if ( prev_rsb_delta - slot->lsb_delta < -32 )             */
+  /*        else if ( prev_rsb_delta - slot->lsb_delta < -31 )             */
   /*          origin_x += 64;                                              */
   /*                                                                       */
   /*        prev_rsb_delta = slot->rsb_delta;                              */
@@ -1888,8 +1980,8 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /*    If compilation option FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES is   */
   /*    set, this function reads the `FREETYPE_PROPERTIES' environment     */
-  /*    variable to control driver properties.  See sections @auto_hinter, */
-  /*    @cff_driver, @pcf_driver, and @tt_driver for more.                 */
+  /*    variable to control driver properties.  See section @properties    */
+  /*    for more.                                                          */
   /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Init_FreeType( FT_Library  *alibrary );
@@ -2148,14 +2240,14 @@ FT_BEGIN_HEADER
   /*                  with value~0).  Set it to~0 if there is only one     */
   /*                  face in the font file.                               */
   /*                                                                       */
-  /*                  Bits 16-30 are relevant to GX and OpenType variation */
-  /*                  fonts only, specifying the named instance index for  */
-  /*                  the current face index (starting with value~1;       */
-  /*                  value~0 makes FreeType ignore named instances).  For */
-  /*                  non-variation fonts, bits 16-30 are ignored.         */
-  /*                  Assuming that you want to access the third named     */
-  /*                  instance in face~4, `face_index' should be set to    */
-  /*                  0x00030004.  If you want to access face~4 without    */
+  /*                  [Since 2.6.1] Bits 16-30 are relevant to GX and      */
+  /*                  OpenType variation fonts only, specifying the named  */
+  /*                  instance index for the current face index (starting  */
+  /*                  with value~1; value~0 makes FreeType ignore named    */
+  /*                  instances).  For non-variation fonts, bits 16-30 are */
+  /*                  ignored.  Assuming that you want to access the third */
+  /*                  named instance in face~4, `face_index' should be set */
+  /*                  to 0x00030004.  If you want to access face~4 without */
   /*                  variation handling, simply set `face_index' to       */
   /*                  value~4.                                             */
   /*                                                                       */
@@ -2862,26 +2954,26 @@ FT_BEGIN_HEADER
    *     Disable the auto-hinter.  See also the note below.
    *
    *   FT_LOAD_COLOR ::
-   *     Load embedded color bitmap images.  The resulting color bitmaps,
-   *     if available, will have the @FT_PIXEL_MODE_BGRA format.  If the
-   *     flag is not set and color bitmaps are found, they are converted
-   *     to 256-level gray bitmaps transparently, using the
+   *     [Since 2.5] Load embedded color bitmap images.  The resulting color
+   *     bitmaps, if available, will have the @FT_PIXEL_MODE_BGRA format.
+   *     If the flag is not set and color bitmaps are found, they are
+   *     converted to 256-level gray bitmaps transparently, using the
    *     @FT_PIXEL_MODE_GRAY format.
    *
    *   FT_LOAD_COMPUTE_METRICS ::
-   *     Compute glyph metrics from the glyph data, without the use of
-   *     bundled metrics tables (for example, the `hdmx' table in TrueType
-   *     fonts).  This flag is mainly used by font validating or font
-   *     editing applications, which need to ignore, verify, or edit those
-   *     tables.
+   *     [Since 2.6.1] Compute glyph metrics from the glyph data, without
+   *     the use of bundled metrics tables (for example, the `hdmx' table in
+   *     TrueType fonts).  This flag is mainly used by font validating or
+   *     font editing applications, which need to ignore, verify, or edit
+   *     those tables.
    *
    *     Currently, this flag is only implemented for TrueType fonts.
    *
    *   FT_LOAD_BITMAP_METRICS_ONLY ::
-   *     Request loading of the metrics and bitmap image information of a
-   *     (possibly embedded) bitmap glyph without allocating or copying
-   *     the bitmap image data itself.  No effect if the target glyph is
-   *     not a bitmap image.
+   *     [Since 2.7.1] Request loading of the metrics and bitmap image
+   *     information of a (possibly embedded) bitmap glyph without
+   *     allocating or copying the bitmap image data itself.  No effect if
+   *     the target glyph is not a bitmap image.
    *
    *     This flag unsets @FT_LOAD_RENDER.
    *
@@ -3124,11 +3216,13 @@ FT_BEGIN_HEADER
   /*      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.                             */
+  /*    Should you define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your      */
+  /*    `ftoption.h', which enables patented ClearType-style rendering,    */
+  /*    the LCD-optimized glyph bitmaps should be filtered to reduce color */
+  /*    fringes inherent to this technology.  You can either set up LCD    */
+  /*    filtering with @FT_Library_SetLcdFilter or @FT_Face_Properties,    */
+  /*    or do the filtering yourself.  The default FreeType LCD rendering  */
+  /*    technology does not require filtering.                             */
   /*                                                                       */
   /*    The selected render mode only affects vector glyphs of a font.     */
   /*    Embedded bitmaps often have a different pixel mode like            */
@@ -3462,7 +3556,14 @@ FT_BEGIN_HEADER
   /*    retrieve it.  FreeType follows Adobe TechNote #5902, `Generating   */
   /*    PostScript Names for Fonts Using OpenType Font Variations'.        */
   /*                                                                       */
-  /*      http://wwwimages.adobe.com/content/dam/Adobe/en/devnet/font/pdfs/5902.AdobePSNameGeneration.html */
+  /*      https://download.macromedia.com/pub/developer/opentype/tech-notes/5902.AdobePSNameGeneration.html */
+  /*                                                                       */
+  /*    [Since 2.9] Special PostScript names for named instances are only  */
+  /*    returned if the named instance is set with @FT_Set_Named_Instance  */
+  /*    (and the font has corresponding entries in its `fvar' table).  If  */
+  /*    @FT_IS_VARIATION returns true, the algorithmically derived         */
+  /*    PostScript name is provided, not looking up special entries for    */
+  /*    named instances.                                                   */
   /*                                                                       */
   FT_EXPORT( const char* )
   FT_Get_Postscript_Name( FT_Face  face );
@@ -3693,17 +3794,17 @@ FT_BEGIN_HEADER
    *   Note that only a subset of the available properties can be
    *   controlled.
    *
-   *   * Stem darkening (@FT_PARAM_TAG_STEM_DARKENING, corresponding to the
-   *     property `no-stem-darkening' provided by the `autofit' and `cff'
-   *     modules; see @no-stem-darkening[autofit] and
-   *     @no-stem-darkening[cff]).
+   *   * @FT_PARAM_TAG_STEM_DARKENING (stem darkening, corresponding to the
+   *     property `no-stem-darkening' provided by the `autofit', `cff',
+   *     `type1', and `t1cid' modules; see @no-stem-darkening).
    *
-   *   * LCD filter weights (@FT_PARAM_TAG_LCD_FILTER_WEIGHTS, corresponding
+   *   * @FT_PARAM_TAG_LCD_FILTER_WEIGHTS (LCD filter weights, corresponding
    *     to function @FT_Library_SetLcdFilterWeights).
    *
-   *   * Seed value for the CFF `random' operator
-   *     (@FT_PARAM_TAG_RANDOM_SEED, corresponding to the `random-seed'
-   *     property provided by the `cff' module; see @random-seed).
+   *   * @FT_PARAM_TAG_RANDOM_SEED (seed value for the CFF, Type~1, and CID
+   *     `random' operator, corresponding to the `random-seed' property
+   *     provided by the `cff', `type1', and `t1cid' modules; see
+   *     @random-seed).
    *
    *   Pass NULL as `data' in @FT_Parameter for a given tag to reset the
    *   option and use the library or module default again.
@@ -3766,6 +3867,9 @@ FT_BEGIN_HEADER
    *     FT_Face_Properties( face, 1, &property );
    *   }
    *
+   * @since:
+   *   2.8
+   *
    */
   FT_EXPORT( FT_Error )
   FT_Face_Properties( FT_Face        face,
@@ -3890,7 +3994,7 @@ FT_BEGIN_HEADER
   /*    and subsetting restrictions associated with a font.                */
   /*                                                                       */
   /*    See                                                                */
-  /*    http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf */
+  /*    https://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf */
   /*    for more details.                                                  */
   /*                                                                       */
   /* <Values>                                                              */
@@ -3990,9 +4094,9 @@ FT_BEGIN_HEADER
   /*    Sequences' (IVS), collected in the `Ideographic Variation          */
   /*    Database' (IVD).                                                   */
   /*                                                                       */
-  /*      http://unicode.org/Public/UCD/latest/ucd/StandardizedVariants.txt */
-  /*      http://unicode.org/reports/tr37/                                 */
-  /*      http://unicode.org/ivd/                                          */
+  /*      https://unicode.org/Public/UCD/latest/ucd/StandardizedVariants.txt */
+  /*      https://unicode.org/reports/tr37/                                */
+  /*      https://unicode.org/ivd/                                         */
   /*                                                                       */
   /*    To date (January 2017), the character with the most ideographic    */
   /*    variations is U+9089, having 32 such IVS.                          */
@@ -4327,6 +4431,9 @@ FT_BEGIN_HEADER
   /*    `a' rounded to the nearest 16.16 fixed integer, halfway cases away */
   /*    from zero.                                                         */
   /*                                                                       */
+  /* <Note>                                                                */
+  /*    The function uses wrap-around arithmetic.                          */
+  /*                                                                       */
   FT_EXPORT( FT_Fixed )
   FT_RoundFix( FT_Fixed  a );
 
@@ -4345,6 +4452,9 @@ FT_BEGIN_HEADER
   /* <Return>                                                              */
   /*    `a' rounded towards plus infinity.                                 */
   /*                                                                       */
+  /* <Note>                                                                */
+  /*    The function uses wrap-around arithmetic.                          */
+  /*                                                                       */
   FT_EXPORT( FT_Fixed )
   FT_CeilFix( FT_Fixed  a );
 
@@ -4441,7 +4551,7 @@ FT_BEGIN_HEADER
    *
    */
 #define FREETYPE_MAJOR  2
-#define FREETYPE_MINOR  8
+#define FREETYPE_MINOR  9
 #define FREETYPE_PATCH  0
 
 
index dea96e0..f78e8b1 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Quick computation of advance widths (specification only).            */
 /*                                                                         */
-/*  Copyright 2008-2017 by                                                 */
+/*  Copyright 2008-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/include/freetype/ftautoh.h b/include/freetype/ftautoh.h
deleted file mode 100644 (file)
index abd540f..0000000
+++ /dev/null
@@ -1,533 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftautoh.h                                                              */
-/*                                                                         */
-/*    FreeType API for controlling the auto-hinter (specification only).   */
-/*                                                                         */
-/*  Copyright 2012-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.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 FTAUTOH_H_
-#define FTAUTOH_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:
-   *   auto_hinter
-   *
-   * @title:
-   *   The auto-hinter
-   *
-   * @abstract:
-   *   Controlling the auto-hinting module.
-   *
-   * @description:
-   *   While FreeType's auto-hinter doesn't expose API functions by itself,
-   *   it is possible to control its behaviour with @FT_Property_Set and
-   *   @FT_Property_Get.  The following lists the available properties
-   *   together with the necessary macros and structures.
-   *
-   *   Note that the auto-hinter's module name is `autofitter' for
-   *   historical reasons.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   glyph-to-script-map
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   The auto-hinter provides various script modules to hint glyphs.
-   *   Examples of supported scripts are Latin or CJK.  Before a glyph is
-   *   auto-hinted, the Unicode character map of the font gets examined, and
-   *   the script is then determined based on Unicode character ranges, see
-   *   below.
-   *
-   *   OpenType fonts, however, often provide much more glyphs than
-   *   character codes (small caps, superscripts, ligatures, swashes, etc.),
-   *   to be controlled by so-called `features'.  Handling OpenType features
-   *   can be quite complicated and thus needs a separate library on top of
-   *   FreeType.
-   *
-   *   The mapping between glyph indices and scripts (in the auto-hinter
-   *   sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an
-   *   array with `num_glyphs' elements, as found in the font's @FT_Face
-   *   structure.  The `glyph-to-script-map' property returns a pointer to
-   *   this array, which can be modified as needed.  Note that the
-   *   modification should happen before the first glyph gets processed by
-   *   the auto-hinter so that the global analysis of the font shapes
-   *   actually uses the modified mapping.
-   *
-   *   The following example code demonstrates how to access it (omitting
-   *   the error handling).
-   *
-   *   {
-   *     FT_Library                library;
-   *     FT_Face                   face;
-   *     FT_Prop_GlyphToScriptMap  prop;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *     FT_New_Face( library, "foo.ttf", 0, &face );
-   *
-   *     prop.face = face;
-   *
-   *     FT_Property_Get( library, "autofitter",
-   *                               "glyph-to-script-map", &prop );
-   *
-   *     // adjust `prop.map' as needed right here
-   *
-   *     FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );
-   *   }
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @enum:
-   *   FT_AUTOHINTER_SCRIPT_XXX
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   A list of constants used for the @glyph-to-script-map property to
-   *   specify the script submodule the auto-hinter should use for hinting a
-   *   particular glyph.
-   *
-   * @values:
-   *   FT_AUTOHINTER_SCRIPT_NONE ::
-   *     Don't auto-hint this glyph.
-   *
-   *   FT_AUTOHINTER_SCRIPT_LATIN ::
-   *     Apply the latin auto-hinter.  For the auto-hinter, `latin' is a
-   *     very broad term, including Cyrillic and Greek also since characters
-   *     from those scripts share the same design constraints.
-   *
-   *     By default, characters from the following Unicode ranges are
-   *     assigned to this submodule.
-   *
-   *     {
-   *       U+0020 - U+007F  // Basic Latin (no control characters)
-   *       U+00A0 - U+00FF  // Latin-1 Supplement (no control characters)
-   *       U+0100 - U+017F  // Latin Extended-A
-   *       U+0180 - U+024F  // Latin Extended-B
-   *       U+0250 - U+02AF  // IPA Extensions
-   *       U+02B0 - U+02FF  // Spacing Modifier Letters
-   *       U+0300 - U+036F  // Combining Diacritical Marks
-   *       U+0370 - U+03FF  // Greek and Coptic
-   *       U+0400 - U+04FF  // Cyrillic
-   *       U+0500 - U+052F  // Cyrillic Supplement
-   *       U+1D00 - U+1D7F  // Phonetic Extensions
-   *       U+1D80 - U+1DBF  // Phonetic Extensions Supplement
-   *       U+1DC0 - U+1DFF  // Combining Diacritical Marks Supplement
-   *       U+1E00 - U+1EFF  // Latin Extended Additional
-   *       U+1F00 - U+1FFF  // Greek Extended
-   *       U+2000 - U+206F  // General Punctuation
-   *       U+2070 - U+209F  // Superscripts and Subscripts
-   *       U+20A0 - U+20CF  // Currency Symbols
-   *       U+2150 - U+218F  // Number Forms
-   *       U+2460 - U+24FF  // Enclosed Alphanumerics
-   *       U+2C60 - U+2C7F  // Latin Extended-C
-   *       U+2DE0 - U+2DFF  // Cyrillic Extended-A
-   *       U+2E00 - U+2E7F  // Supplemental Punctuation
-   *       U+A640 - U+A69F  // Cyrillic Extended-B
-   *       U+A720 - U+A7FF  // Latin Extended-D
-   *       U+FB00 - U+FB06  // Alphab. Present. Forms (Latin Ligatures)
-   *      U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols
-   *      U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement
-   *     }
-   *
-   *   FT_AUTOHINTER_SCRIPT_CJK ::
-   *     Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old
-   *     Vietnamese, and some other scripts.
-   *
-   *     By default, characters from the following Unicode ranges are
-   *     assigned to this submodule.
-   *
-   *     {
-   *       U+1100 - U+11FF  // Hangul Jamo
-   *       U+2E80 - U+2EFF  // CJK Radicals Supplement
-   *       U+2F00 - U+2FDF  // Kangxi Radicals
-   *       U+2FF0 - U+2FFF  // Ideographic Description Characters
-   *       U+3000 - U+303F  // CJK Symbols and Punctuation
-   *       U+3040 - U+309F  // Hiragana
-   *       U+30A0 - U+30FF  // Katakana
-   *       U+3100 - U+312F  // Bopomofo
-   *       U+3130 - U+318F  // Hangul Compatibility Jamo
-   *       U+3190 - U+319F  // Kanbun
-   *       U+31A0 - U+31BF  // Bopomofo Extended
-   *       U+31C0 - U+31EF  // CJK Strokes
-   *       U+31F0 - U+31FF  // Katakana Phonetic Extensions
-   *       U+3200 - U+32FF  // Enclosed CJK Letters and Months
-   *       U+3300 - U+33FF  // CJK Compatibility
-   *       U+3400 - U+4DBF  // CJK Unified Ideographs Extension A
-   *       U+4DC0 - U+4DFF  // Yijing Hexagram Symbols
-   *       U+4E00 - U+9FFF  // CJK Unified Ideographs
-   *       U+A960 - U+A97F  // Hangul Jamo Extended-A
-   *       U+AC00 - U+D7AF  // Hangul Syllables
-   *       U+D7B0 - U+D7FF  // Hangul Jamo Extended-B
-   *       U+F900 - U+FAFF  // CJK Compatibility Ideographs
-   *       U+FE10 - U+FE1F  // Vertical forms
-   *       U+FE30 - U+FE4F  // CJK Compatibility Forms
-   *       U+FF00 - U+FFEF  // Halfwidth and Fullwidth Forms
-   *      U+1B000 - U+1B0FF // Kana Supplement
-   *      U+1D300 - U+1D35F // Tai Xuan Hing Symbols
-   *      U+1F200 - U+1F2FF // Enclosed Ideographic Supplement
-   *      U+20000 - U+2A6DF // CJK Unified Ideographs Extension B
-   *      U+2A700 - U+2B73F // CJK Unified Ideographs Extension C
-   *      U+2B740 - U+2B81F // CJK Unified Ideographs Extension D
-   *      U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement
-   *     }
-   *
-   *   FT_AUTOHINTER_SCRIPT_INDIC ::
-   *     Apply the indic auto-hinter, covering all major scripts from the
-   *     Indian sub-continent and some other related scripts like Thai, Lao,
-   *     or Tibetan.
-   *
-   *     By default, characters from the following Unicode ranges are
-   *     assigned to this submodule.
-   *
-   *     {
-   *       U+0900 - U+0DFF  // Indic Range
-   *       U+0F00 - U+0FFF  // Tibetan
-   *       U+1900 - U+194F  // Limbu
-   *       U+1B80 - U+1BBF  // Sundanese
-   *       U+A800 - U+A82F  // Syloti Nagri
-   *       U+ABC0 - U+ABFF  // Meetei Mayek
-   *      U+11800 - U+118DF // Sharada
-   *     }
-   *
-   *     Note that currently Indic support is rudimentary only, missing blue
-   *     zone support.
-   *
-   */
-#define FT_AUTOHINTER_SCRIPT_NONE   0
-#define FT_AUTOHINTER_SCRIPT_LATIN  1
-#define FT_AUTOHINTER_SCRIPT_CJK    2
-#define FT_AUTOHINTER_SCRIPT_INDIC  3
-
-
-  /**************************************************************************
-   *
-   * @struct:
-   *   FT_Prop_GlyphToScriptMap
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   The data exchange structure for the @glyph-to-script-map property.
-   *
-   */
-  typedef struct  FT_Prop_GlyphToScriptMap_
-  {
-    FT_Face     face;
-    FT_UShort*  map;
-
-  } FT_Prop_GlyphToScriptMap;
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   fallback-script
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   If no auto-hinter script module can be assigned to a glyph, a
-   *   fallback script gets assigned to it (see also the
-   *   @glyph-to-script-map property).  By default, this is
-   *   @FT_AUTOHINTER_SCRIPT_CJK.  Using the `fallback-script' property,
-   *   this fallback value can be changed.
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_UInt     fallback_script = FT_AUTOHINTER_SCRIPT_NONE;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "autofitter",
-   *                               "fallback-script", &fallback_script );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   It's important to use the right timing for changing this value: The
-   *   creation of the glyph-to-script map that eventually uses the
-   *   fallback script value gets triggered either by setting or reading a
-   *   face-specific property like @glyph-to-script-map, or by auto-hinting
-   *   any glyph from that face.  In particular, if you have already created
-   *   an @FT_Face structure but not loaded any glyph (using the
-   *   auto-hinter), a change of the fallback script will affect this face.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   default-script
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   If FreeType gets compiled with FT_CONFIG_OPTION_USE_HARFBUZZ to make
-   *   the HarfBuzz library access OpenType features for getting better
-   *   glyph coverages, this property sets the (auto-fitter) script to be
-   *   used for the default (OpenType) script data of a font's GSUB table.
-   *   Features for the default script are intended for all scripts not
-   *   explicitly handled in GSUB; an example is a `dlig' feature,
-   *   containing the combination of the characters `T', `E', and `L' to
-   *   form a `TEL' ligature.
-   *
-   *   By default, this is @FT_AUTOHINTER_SCRIPT_LATIN.  Using the
-   *   `default-script' property, this default value can be changed.
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_UInt     default_script = FT_AUTOHINTER_SCRIPT_NONE;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "autofitter",
-   *                               "default-script", &default_script );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   It's important to use the right timing for changing this value: The
-   *   creation of the glyph-to-script map that eventually uses the
-   *   default script value gets triggered either by setting or reading a
-   *   face-specific property like @glyph-to-script-map, or by auto-hinting
-   *   any glyph from that face.  In particular, if you have already created
-   *   an @FT_Face structure but not loaded any glyph (using the
-   *   auto-hinter), a change of the default script will affect this face.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   increase-x-height
-   *
-   * @description:
-   *   For ppem values in the range 6~<= ppem <= `increase-x-height', round
-   *   up the font's x~height much more often than normally.  If the value
-   *   is set to~0, which is the default, this feature is switched off.  Use
-   *   this property to improve the legibility of small font sizes if
-   *   necessary.
-   *
-   *   {
-   *     FT_Library               library;
-   *     FT_Face                  face;
-   *     FT_Prop_IncreaseXHeight  prop;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *     FT_New_Face( library, "foo.ttf", 0, &face );
-   *     FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );
-   *
-   *     prop.face  = face;
-   *     prop.limit = 14;
-   *
-   *     FT_Property_Set( library, "autofitter",
-   *                               "increase-x-height", &prop );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   Set this value right after calling @FT_Set_Char_Size, but before
-   *   loading any glyph (using the auto-hinter).
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @struct:
-   *   FT_Prop_IncreaseXHeight
-   *
-   * @description:
-   *   The data exchange structure for the @increase-x-height property.
-   *
-   */
-  typedef struct  FT_Prop_IncreaseXHeight_
-  {
-    FT_Face  face;
-    FT_UInt  limit;
-
-  } FT_Prop_IncreaseXHeight;
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   warping
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   If FreeType gets compiled with option AF_CONFIG_OPTION_USE_WARPER to
-   *   activate the warp hinting code in the auto-hinter, this property
-   *   switches warping on and off.
-   *
-   *   Warping only works in `light' auto-hinting mode.  The idea of the
-   *   code is to slightly scale and shift a glyph along the non-hinted
-   *   dimension (which is usually the horizontal axis) so that as much of
-   *   its segments are aligned (more or less) to the grid.  To find out a
-   *   glyph's optimal scaling and shifting value, various parameter
-   *   combinations are tried and scored.
-   *
-   *   By default, warping is off.  The example below shows how to switch on
-   *   warping (omitting the error handling).
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_Bool     warping = 1;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "autofitter",
-   *                               "warping", &warping );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   This property can be set via the `FREETYPE_PROPERTIES' environment
-   *   variable (using values 1 and 0 for `on' and `off', respectively).
-   *
-   *   The warping code can also change advance widths.  Have a look at the
-   *   `lsb_delta' and `rsb_delta' fields in the @FT_GlyphSlotRec structure
-   *   for details on improving inter-glyph distances while rendering.
-   *
-   *   Since warping is a global property of the auto-hinter it is best to
-   *   change its value before rendering any face.  Otherwise, you should
-   *   reload all faces that get auto-hinted in `light' hinting mode.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   no-stem-darkening[autofit]
-   *
-   * @description:
-   *   *Experimental* *only*, *requires* *linear* *alpha* *blending* *and*
-   *   *gamma* *correction*
-   *
-   *   Stem darkening emboldens glyphs at smaller sizes to make them more
-   *   readable on common low-DPI screens when using linear alpha blending
-   *   and gamma correction, see @FT_Render_Glyph.  When not using linear
-   *   alpha blending and gamma correction, glyphs will appear heavy and
-   *   fuzzy!
-   *
-   *   Gamma correction essentially lightens fonts since shades of grey are
-   *   shifted to higher pixel values (=~higher brightness) to match the
-   *   original intention to the reality of our screens.  The side-effect is
-   *   that glyphs `thin out'.  Mac OS~X and Adobe's proprietary font
-   *   rendering library implement a counter-measure: stem darkening at
-   *   smaller sizes where shades of gray dominate.  By emboldening a glyph
-   *   slightly in relation to its pixel size, individual pixels get higher
-   *   coverage of filled-in outlines and are therefore `blacker'.  This
-   *   counteracts the `thinning out' of glyphs, making text remain readable
-   *   at smaller sizes.  All glyphs that pass through the auto-hinter will
-   *   be emboldened unless this property is set to TRUE.
-   *
-   *   See the description of the CFF driver for algorithmic details.  Total
-   *   consistency with the CFF driver is currently not achieved because the
-   *   emboldening method differs and glyphs must be scaled down on the
-   *   Y-axis to keep outline points inside their precomputed blue zones.
-   *   The smaller the size (especially 9ppem and down), the higher the loss
-   *   of emboldening versus the CFF driver.
-   *
-   *   This property can be set via the `FREETYPE_PROPERTIES' environment
-   *   variable similar to the CFF driver.  It can also be set per face
-   *   using @FT_Face_Properties with @FT_PARAM_TAG_STEM_DARKENING.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @constant:
-   *   FT_PARAM_TAG_STEM_DARKENING
-   *
-   * @description:
-   *   An @FT_Parameter tag to be used with @FT_Face_Properties.  The
-   *   corresponding Boolean argument specifies whether to apply stem
-   *   darkening, overriding the global default values or the values set up
-   *   with @FT_Property_Set (see @no-stem-darkening[autofit] and
-   *   @no-stem-darkening[cff]).
-   *
-   *   This is a passive setting that only takes effect if the font driver
-   *   or autohinter honors it, which the CFF driver always does, but the
-   *   autohinter only in `light' hinting mode (as of version 2.7.0).
-   *
-   */
-#define FT_PARAM_TAG_STEM_DARKENING \
-          FT_MAKE_TAG( 'd', 'a', 'r', 'k' )
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   darkening-parameters[autofit]
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   See the description of the CFF driver for details.  This
-   *   implementation appropriates the
-   *   CFF_CONFIG_OPTION_DARKENING_PARAMETER_* #defines for consistency.
-   *   Note the differences described in @no-stem-darkening[autofit].
-   *
-   *   This property can be set via the `FREETYPE_PROPERTIES' environment
-   *   variable similar to the CFF driver.
-   */
-
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTAUTOH_H_ */
-
-
-/* END */
index f03bdc1..f9eb70b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType exact bbox computation (specification).                     */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -61,7 +61,7 @@ FT_BEGIN_HEADER
   /*    Compute the exact bounding box of an outline.  This is slower      */
   /*    than computing the control box.  However, it uses an advanced      */
   /*    algorithm that returns _very_ quickly when the two boxes           */
-  /*    coincide.  Otherwise, the outline Bézier arcs are traversed to     */
+  /*    coincide.  Otherwise, the outline Bezier arcs are traversed to     */
   /*    extract their extrema.                                             */
   /*                                                                       */
   /* <Input>                                                               */
index 3d3106b..1b6dea6 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing BDF-specific strings (specification).     */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 04b2402..a43187c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType utility functions for bitmaps (specification).              */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -97,7 +97,7 @@ FT_BEGIN_HEADER
   FT_EXPORT( FT_Error )
   FT_Bitmap_Copy( FT_Library        library,
                   const FT_Bitmap  *source,
-                  FT_Bitmap        *target);
+                  FT_Bitmap        *target );
 
 
   /*************************************************************************/
index 9147a79..6edfa03 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Bzip2-compressed stream support.                                     */
 /*                                                                         */
-/*  Copyright 2010-2017 by                                                 */
+/*  Copyright 2010-2018 by                                                 */
 /*  Joel Klinghed.                                                         */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 5ff3ccf..52d5f00 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Cache subsystem (specification).                            */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -540,13 +540,6 @@ FT_BEGIN_HEADER
                             FTC_FaceID   face_id );
 
 
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    cache_subsystem                                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
   /*************************************************************************
    *
    * @type:
@@ -624,14 +617,6 @@ FT_BEGIN_HEADER
 
 
   /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    cache_subsystem                                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
diff --git a/include/freetype/ftcffdrv.h b/include/freetype/ftcffdrv.h
deleted file mode 100644 (file)
index 477b6dd..0000000
+++ /dev/null
@@ -1,321 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftcffdrv.h                                                             */
-/*                                                                         */
-/*    FreeType API for controlling the CFF driver (specification only).    */
-/*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.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 FTCFFDRV_H_
-#define FTCFFDRV_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:
-   *   cff_driver
-   *
-   * @title:
-   *   The CFF driver
-   *
-   * @abstract:
-   *   Controlling the CFF driver module.
-   *
-   * @description:
-   *   While FreeType's CFF driver doesn't expose API functions by itself,
-   *   it is possible to control its behaviour with @FT_Property_Set and
-   *   @FT_Property_Get.  The list below gives the available properties
-   *   together with the necessary macros and structures.
-   *
-   *   The CFF driver's module name is `cff'.
-   *
-   *   *Hinting* *and* *antialiasing* *principles* *of* *the* *new* *engine*
-   *
-   *   The rasterizer is positioning horizontal features (e.g., ascender
-   *   height & x-height, or crossbars) on the pixel grid and minimizing the
-   *   amount of antialiasing applied to them, while placing vertical
-   *   features (vertical stems) on the pixel grid without hinting, thus
-   *   representing the stem position and weight accurately.  Sometimes the
-   *   vertical stems may be only partially black.  In this context,
-   *   `antialiasing' means that stems are not positioned exactly on pixel
-   *   borders, causing a fuzzy appearance.
-   *
-   *   There are two principles behind this approach.
-   *
-   *   1) No hinting in the horizontal direction: Unlike `superhinted'
-   *   TrueType, which changes glyph widths to accommodate regular
-   *   inter-glyph spacing, Adobe's approach is `faithful to the design' in
-   *   representing both the glyph width and the inter-glyph spacing
-   *   designed for the font.  This makes the screen display as close as it
-   *   can be to the result one would get with infinite resolution, while
-   *   preserving what is considered the key characteristics of each glyph.
-   *   Note that the distances between unhinted and grid-fitted positions at
-   *   small sizes are comparable to kerning values and thus would be
-   *   noticeable (and distracting) while reading if hinting were applied.
-   *
-   *   One of the reasons to not hint horizontally is antialiasing for LCD
-   *   screens: The pixel geometry of modern displays supplies three
-   *   vertical sub-pixels as the eye moves horizontally across each visible
-   *   pixel.  On devices where we can be certain this characteristic is
-   *   present a rasterizer can take advantage of the sub-pixels to add
-   *   increments of weight.  In Western writing systems this turns out to
-   *   be the more critical direction anyway; the weights and spacing of
-   *   vertical stems (see above) are central to Armenian, Cyrillic, Greek,
-   *   and Latin type designs.  Even when the rasterizer uses greyscale
-   *   antialiasing instead of color (a necessary compromise when one
-   *   doesn't know the screen characteristics), the unhinted vertical
-   *   features preserve the design's weight and spacing much better than
-   *   aliased type would.
-   *
-   *   2) Alignment in the vertical direction: Weights and spacing along the
-   *   y~axis are less critical; what is much more important is the visual
-   *   alignment of related features (like cap-height and x-height).  The
-   *   sense of alignment for these is enhanced by the sharpness of grid-fit
-   *   edges, while the cruder vertical resolution (full pixels instead of
-   *   1/3 pixels) is less of a problem.
-   *
-   *   On the technical side, horizontal alignment zones for ascender,
-   *   x-height, and other important height values (traditionally called
-   *   `blue zones') as defined in the font are positioned independently,
-   *   each being rounded to the nearest pixel edge, taking care of
-   *   overshoot suppression at small sizes, stem darkening, and scaling.
-   *
-   *   Hstems (this is, hint values defined in the font to help align
-   *   horizontal features) that fall within a blue zone are said to be
-   *   `captured' and are aligned to that zone.  Uncaptured stems are moved
-   *   in one of four ways, top edge up or down, bottom edge up or down.
-   *   Unless there are conflicting hstems, the smallest movement is taken
-   *   to minimize distortion.
-   *
-   * @order:
-   *   hinting-engine[cff]
-   *   no-stem-darkening[cff]
-   *   darkening-parameters[cff]
-   *   random-seed
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   hinting-engine[cff]
-   *
-   * @description:
-   *   Thanks to Adobe, which contributed a new hinting (and parsing)
-   *   engine, an application can select between `freetype' and `adobe' if
-   *   compiled with CFF_CONFIG_OPTION_OLD_ENGINE.  If this configuration
-   *   macro isn't defined, `hinting-engine' does nothing.
-   *
-   *   The default engine is `freetype' if CFF_CONFIG_OPTION_OLD_ENGINE is
-   *   defined, and `adobe' otherwise.
-   *
-   *   The following example code demonstrates how to select Adobe's hinting
-   *   engine (omitting the error handling).
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_UInt     hinting_engine = FT_CFF_HINTING_ADOBE;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "cff",
-   *                               "hinting-engine", &hinting_engine );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   This property can be set via the `FREETYPE_PROPERTIES' environment
-   *   variable (using values `adobe' or `freetype').
-   */
-
-
-  /**************************************************************************
-   *
-   * @enum:
-   *   FT_CFF_HINTING_XXX
-   *
-   * @description:
-   *   A list of constants used for the @hinting-engine[cff] property to
-   *   select the hinting engine for CFF fonts.
-   *
-   * @values:
-   *   FT_CFF_HINTING_FREETYPE ::
-   *     Use the old FreeType hinting engine.
-   *
-   *   FT_CFF_HINTING_ADOBE ::
-   *     Use the hinting engine contributed by Adobe.
-   *
-   */
-#define FT_CFF_HINTING_FREETYPE  0
-#define FT_CFF_HINTING_ADOBE     1
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   no-stem-darkening[cff]
-   *
-   * @description:
-   *   By default, the Adobe CFF engine darkens stems at smaller sizes,
-   *   regardless of hinting, to enhance contrast.  This feature requires
-   *   a rendering system with proper gamma correction.  Setting this
-   *   property, stem darkening gets switched off.
-   *
-   *   Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is set.
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_Bool     no_stem_darkening = TRUE;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "cff",
-   *                               "no-stem-darkening", &no_stem_darkening );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   This property can be set via the `FREETYPE_PROPERTIES' environment
-   *   variable (using values 1 and 0 for `on' and `off', respectively).
-   *   It can also be set per face using @FT_Face_Properties with
-   *   @FT_PARAM_TAG_STEM_DARKENING.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   darkening-parameters[cff]
-   *
-   * @description:
-   *   By default, the Adobe CFF engine darkens stems as follows (if the
-   *   `no-stem-darkening' property isn't set):
-   *
-   *   {
-   *     stem width <= 0.5px:   darkening amount = 0.4px
-   *     stem width  = 1px:     darkening amount = 0.275px
-   *     stem width  = 1.667px: darkening amount = 0.275px
-   *     stem width >= 2.333px: darkening amount = 0px
-   *   }
-   *
-   *   and piecewise linear in-between.  At configuration time, these four
-   *   control points can be set with the macro
-   *   `CFF_CONFIG_OPTION_DARKENING_PARAMETERS'.  At runtime, the control
-   *   points can be changed using the `darkening-parameters' property, as
-   *   the following example demonstrates.
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_Int      darken_params[8] = {  500, 300,   // x1, y1
-   *                                      1000, 200,   // x2, y2
-   *                                      1500, 100,   // x3, y3
-   *                                      2000,   0 }; // x4, y4
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "cff",
-   *                               "darkening-parameters", darken_params );
-   *   }
-   *
-   *   The x~values give the stem width, and the y~values the darkening
-   *   amount.  The unit is 1000th of pixels.  All coordinate values must be
-   *   positive; the x~values must be monotonically increasing; the
-   *   y~values must be monotonically decreasing and smaller than or
-   *   equal to 500 (corresponding to half a pixel); the slope of each
-   *   linear piece must be shallower than -1 (e.g., -.4).
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   This property can be set via the `FREETYPE_PROPERTIES' environment
-   *   variable, using eight comma-separated integers without spaces.  Here
-   *   the above example, using `\' to break the line for readability.
-   *
-   *   {
-   *     FREETYPE_PROPERTIES=\
-   *     cff:darkening-parameters=500,300,1000,200,1500,100,2000,0
-   *   }
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   random-seed
-   *
-   * @description:
-   *   By default, the seed value for the CFF `random' operator is set to a
-   *   random value.  However, mainly for debugging purposes, it is often
-   *   necessary to use a known value as a seed so that the pseudo-random
-   *   number sequences generated by `random' are repeatable.
-   *
-   *   The `random-seed' property does that.  Its argument is a signed 32bit
-   *   integer; if the value is zero or negative, the seed given by the
-   *   `intitialRandomSeed' private DICT operator in a CFF file gets used
-   *   (or a default value if there is no such operator).  If the value is
-   *   positive, use it instead of `initialRandomSeed', which is
-   *   consequently ignored.
-   *
-   * @note:
-   *   This property can be set via the `FREETYPE_PROPERTIES' environment
-   *   variable.  It can also be set per face using @FT_Face_Properties with
-   *   @FT_PARAM_TAG_RANDOM_SEED.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @constant:
-   *   FT_PARAM_TAG_RANDOM_SEED
-   *
-   * @description:
-   *   An @FT_Parameter tag to be used with @FT_Face_Properties.  The
-   *   corresponding 32bit signed integer argument overrides the CFF
-   *   module's random seed value with a face-specific one; see
-   *   @random-seed.
-   *
-   */
-#define FT_PARAM_TAG_RANDOM_SEED \
-          FT_MAKE_TAG( 's', 'e', 'e', 'd' )
-
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* FTCFFDRV_H_ */
-
-
-/* END */
index a0a121b..51257bb 100644 (file)
 /* <Sections>                                                              */
 /*    auto_hinter                                                          */
 /*    cff_driver                                                           */
+/*    t1_cid_driver                                                        */
 /*    tt_driver                                                            */
 /*    pcf_driver                                                           */
+/*    properties                                                           */
+/*    parameter_tags                                                       */
 /*                                                                         */
 /***************************************************************************/
 
index 4adcbee..5e9100a 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing CID font information (specification).     */
 /*                                                                         */
-/*  Copyright 2007-2017 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  Dereg Clegg and Michael Toftdal.                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -87,7 +87,7 @@ FT_BEGIN_HEADER
   FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,
                                            const char*  *registry,
                                            const char*  *ordering,
-                                           FT_Int       *supplement);
+                                           FT_Int       *supplement );
 
 
   /**********************************************************************
diff --git a/include/freetype/ftdriver.h b/include/freetype/ftdriver.h
new file mode 100644 (file)
index 0000000..02d104d
--- /dev/null
@@ -0,0 +1,1225 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftdriver.h                                                             */
+/*                                                                         */
+/*    FreeType API for controlling driver modules (specification only).    */
+/*                                                                         */
+/*  Copyright 2017-2018 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.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_FREETYPE_H
+#include FT_PARAMETER_TAGS_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:
+   *   auto_hinter
+   *
+   * @title:
+   *   The auto-hinter
+   *
+   * @abstract:
+   *   Controlling the auto-hinting module.
+   *
+   * @description:
+   *   While FreeType's auto-hinter doesn't expose API functions by itself,
+   *   it is possible to control its behaviour with @FT_Property_Set and
+   *   @FT_Property_Get.  The following lists the available properties
+   *   together with the necessary macros and structures.
+   *
+   *   Note that the auto-hinter's module name is `autofitter' for
+   *   historical reasons.
+   *
+   *   Available properties are @increase-x-height, @no-stem-darkening
+   *   (experimental), @darkening-parameters (experimental), @warping
+   *   (experimental), @glyph-to-script-map (experimental), @fallback-script
+   *   (experimental), and @default-script (experimental), as documented in
+   *   the @properties section.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   cff_driver
+   *
+   * @title:
+   *   The CFF driver
+   *
+   * @abstract:
+   *   Controlling the CFF driver module.
+   *
+   * @description:
+   *   While FreeType's CFF driver doesn't expose API functions by itself,
+   *   it is possible to control its behaviour with @FT_Property_Set and
+   *   @FT_Property_Get.
+   *
+   *   The CFF driver's module name is `cff'.
+   *
+   *   Available properties are @hinting-engine, @no-stem-darkening,
+   *   @darkening-parameters, and @random-seed, as documented in the
+   *   @properties section.
+   *
+   *
+   *   *Hinting* *and* *antialiasing* *principles* *of* *the* *new* *engine*
+   *
+   *   The rasterizer is positioning horizontal features (e.g., ascender
+   *   height & x-height, or crossbars) on the pixel grid and minimizing the
+   *   amount of antialiasing applied to them, while placing vertical
+   *   features (vertical stems) on the pixel grid without hinting, thus
+   *   representing the stem position and weight accurately.  Sometimes the
+   *   vertical stems may be only partially black.  In this context,
+   *   `antialiasing' means that stems are not positioned exactly on pixel
+   *   borders, causing a fuzzy appearance.
+   *
+   *   There are two principles behind this approach.
+   *
+   *   1) No hinting in the horizontal direction: Unlike `superhinted'
+   *   TrueType, which changes glyph widths to accommodate regular
+   *   inter-glyph spacing, Adobe's approach is `faithful to the design' in
+   *   representing both the glyph width and the inter-glyph spacing
+   *   designed for the font.  This makes the screen display as close as it
+   *   can be to the result one would get with infinite resolution, while
+   *   preserving what is considered the key characteristics of each glyph.
+   *   Note that the distances between unhinted and grid-fitted positions at
+   *   small sizes are comparable to kerning values and thus would be
+   *   noticeable (and distracting) while reading if hinting were applied.
+   *
+   *   One of the reasons to not hint horizontally is antialiasing for LCD
+   *   screens: The pixel geometry of modern displays supplies three
+   *   vertical sub-pixels as the eye moves horizontally across each visible
+   *   pixel.  On devices where we can be certain this characteristic is
+   *   present a rasterizer can take advantage of the sub-pixels to add
+   *   increments of weight.  In Western writing systems this turns out to
+   *   be the more critical direction anyway; the weights and spacing of
+   *   vertical stems (see above) are central to Armenian, Cyrillic, Greek,
+   *   and Latin type designs.  Even when the rasterizer uses greyscale
+   *   antialiasing instead of color (a necessary compromise when one
+   *   doesn't know the screen characteristics), the unhinted vertical
+   *   features preserve the design's weight and spacing much better than
+   *   aliased type would.
+   *
+   *   2) Alignment in the vertical direction: Weights and spacing along the
+   *   y~axis are less critical; what is much more important is the visual
+   *   alignment of related features (like cap-height and x-height).  The
+   *   sense of alignment for these is enhanced by the sharpness of grid-fit
+   *   edges, while the cruder vertical resolution (full pixels instead of
+   *   1/3 pixels) is less of a problem.
+   *
+   *   On the technical side, horizontal alignment zones for ascender,
+   *   x-height, and other important height values (traditionally called
+   *   `blue zones') as defined in the font are positioned independently,
+   *   each being rounded to the nearest pixel edge, taking care of
+   *   overshoot suppression at small sizes, stem darkening, and scaling.
+   *
+   *   Hstems (this is, hint values defined in the font to help align
+   *   horizontal features) that fall within a blue zone are said to be
+   *   `captured' and are aligned to that zone.  Uncaptured stems are moved
+   *   in one of four ways, top edge up or down, bottom edge up or down.
+   *   Unless there are conflicting hstems, the smallest movement is taken
+   *   to minimize distortion.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   pcf_driver
+   *
+   * @title:
+   *   The PCF driver
+   *
+   * @abstract:
+   *   Controlling the PCF driver module.
+   *
+   * @description:
+   *   While FreeType's PCF driver doesn't expose API functions by itself,
+   *   it is possible to control its behaviour with @FT_Property_Set and
+   *   @FT_Property_Get.  Right now, there is a single property
+   *   @no-long-family-names available if FreeType is compiled with
+   *   PCF_CONFIG_OPTION_LONG_FAMILY_NAMES.
+   *
+   *   The PCF driver's module name is `pcf'.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   t1_cid_driver
+   *
+   * @title:
+   *   The Type 1 and CID drivers
+   *
+   * @abstract:
+   *   Controlling the Type~1 and CID driver modules.
+   *
+   * @description:
+   *   It is possible to control the behaviour of FreeType's Type~1 and
+   *   Type~1 CID drivers with @FT_Property_Set and @FT_Property_Get.
+   *
+   *   Behind the scenes, both drivers use the Adobe CFF engine for hinting;
+   *   however, the used properties must be specified separately.
+   *
+   *   The Type~1 driver's module name is `type1'; the CID driver's module
+   *   name is `t1cid'.
+   *
+   *   Available properties are @hinting-engine, @no-stem-darkening,
+   *   @darkening-parameters, and @random-seed, as documented in the
+   *   @properties section.
+   *
+   *   Please see the @cff_driver section for more details on the new
+   *   hinting engine.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   tt_driver
+   *
+   * @title:
+   *   The TrueType driver
+   *
+   * @abstract:
+   *   Controlling the TrueType driver module.
+   *
+   * @description:
+   *   While FreeType's TrueType driver doesn't expose API functions by
+   *   itself, it is possible to control its behaviour with @FT_Property_Set
+   *   and @FT_Property_Get.  The following lists the available properties
+   *   together with the necessary macros and structures.
+   *
+   *   The TrueType driver's module name is `truetype'.
+   *
+   *   A single property @interpreter-version is available, as documented in
+   *   the @properties section.
+   *
+   *   We start with a list of definitions, kindly provided by Greg
+   *   Hitchcock.
+   *
+   *   _Bi-Level_ _Rendering_
+   *
+   *   Monochromatic rendering, exclusively used in the early days of
+   *   TrueType by both Apple and Microsoft.  Microsoft's GDI interface
+   *   supported hinting of the right-side bearing point, such that the
+   *   advance width could be non-linear.  Most often this was done to
+   *   achieve some level of glyph symmetry.  To enable reasonable
+   *   performance (e.g., not having to run hinting on all glyphs just to
+   *   get the widths) there was a bit in the head table indicating if the
+   *   side bearing was hinted, and additional tables, `hdmx' and `LTSH', to
+   *   cache hinting widths across multiple sizes and device aspect ratios.
+   *
+   *   _Font_ _Smoothing_
+   *
+   *   Microsoft's GDI implementation of anti-aliasing.  Not traditional
+   *   anti-aliasing as the outlines were hinted before the sampling.  The
+   *   widths matched the bi-level rendering.
+   *
+   *   _ClearType_ _Rendering_
+   *
+   *   Technique that uses physical subpixels to improve rendering on LCD
+   *   (and other) displays.  Because of the higher resolution, many methods
+   *   of improving symmetry in glyphs through hinting the right-side
+   *   bearing were no longer necessary.  This lead to what GDI calls
+   *   `natural widths' ClearType, see
+   *   http://www.beatstamm.com/typography/RTRCh4.htm#Sec21.  Since hinting
+   *   has extra resolution, most non-linearity went away, but it is still
+   *   possible for hints to change the advance widths in this mode.
+   *
+   *   _ClearType_ _Compatible_ _Widths_
+   *
+   *   One of the earliest challenges with ClearType was allowing the
+   *   implementation in GDI to be selected without requiring all UI and
+   *   documents to reflow.  To address this, a compatible method of
+   *   rendering ClearType was added where the font hints are executed once
+   *   to determine the width in bi-level rendering, and then re-run in
+   *   ClearType, with the difference in widths being absorbed in the font
+   *   hints for ClearType (mostly in the white space of hints); see
+   *   http://www.beatstamm.com/typography/RTRCh4.htm#Sec20.  Somewhat by
+   *   definition, compatible width ClearType allows for non-linear widths,
+   *   but only when the bi-level version has non-linear widths.
+   *
+   *   _ClearType_ _Subpixel_ _Positioning_
+   *
+   *   One of the nice benefits of ClearType is the ability to more crisply
+   *   display fractional widths; unfortunately, the GDI model of integer
+   *   bitmaps did not support this.  However, the WPF and Direct Write
+   *   frameworks do support fractional widths.  DWrite calls this `natural
+   *   mode', not to be confused with GDI's `natural widths'.  Subpixel
+   *   positioning, in the current implementation of Direct Write,
+   *   unfortunately does not support hinted advance widths, see
+   *   http://www.beatstamm.com/typography/RTRCh4.htm#Sec22.  Note that the
+   *   TrueType interpreter fully allows the advance width to be adjusted in
+   *   this mode, just the DWrite client will ignore those changes.
+   *
+   *   _ClearType_ _Backward_ _Compatibility_
+   *
+   *   This is a set of exceptions made in the TrueType interpreter to
+   *   minimize hinting techniques that were problematic with the extra
+   *   resolution of ClearType; see
+   *   http://www.beatstamm.com/typography/RTRCh4.htm#Sec1 and
+   *   https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx.
+   *   This technique is not to be confused with ClearType compatible
+   *   widths.  ClearType backward compatibility has no direct impact on
+   *   changing advance widths, but there might be an indirect impact on
+   *   disabling some deltas.  This could be worked around in backward
+   *   compatibility mode.
+   *
+   *   _Native_ _ClearType_ _Mode_
+   *
+   *   (Not to be confused with `natural widths'.)  This mode removes all
+   *   the exceptions in the TrueType interpreter when running with
+   *   ClearType.  Any issues on widths would still apply, though.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @section:
+   *   properties
+   *
+   * @title:
+   *   Driver properties
+   *
+   * @abstract:
+   *   Controlling driver modules.
+   *
+   * @description:
+   *   Driver modules can be controlled by setting and unsetting properties,
+   *   using the functions @FT_Property_Set and @FT_Property_Get.  This
+   *   section documents the available properties, together with auxiliary
+   *   macros and structures.
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @enum:
+   *   FT_HINTING_XXX
+   *
+   * @description:
+   *   A list of constants used for the @hinting-engine property to
+   *   select the hinting engine for CFF, Type~1, and CID fonts.
+   *
+   * @values:
+   *   FT_HINTING_FREETYPE ::
+   *     Use the old FreeType hinting engine.
+   *
+   *   FT_HINTING_ADOBE ::
+   *     Use the hinting engine contributed by Adobe.
+   *
+   * @since:
+   *   2.9
+   *
+   */
+#define FT_HINTING_FREETYPE  0
+#define FT_HINTING_ADOBE     1
+
+  /* these constants (introduced in 2.4.12) are deprecated */
+#define FT_CFF_HINTING_FREETYPE  FT_HINTING_FREETYPE
+#define FT_CFF_HINTING_ADOBE     FT_HINTING_ADOBE
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   hinting-engine
+   *
+   * @description:
+   *   Thanks to Adobe, which contributed a new hinting (and parsing)
+   *   engine, an application can select between `freetype' and `adobe' if
+   *   compiled with CFF_CONFIG_OPTION_OLD_ENGINE.  If this configuration
+   *   macro isn't defined, `hinting-engine' does nothing.
+   *
+   *   The same holds for the Type~1 and CID modules if compiled with
+   *   T1_CONFIG_OPTION_OLD_ENGINE.
+   *
+   *   For the `cff' module, the default engine is `freetype' if
+   *   CFF_CONFIG_OPTION_OLD_ENGINE is defined, and `adobe' otherwise.
+   *
+   *   For both the `type1' and `t1cid' modules, the default engine is
+   *   `freetype' if T1_CONFIG_OPTION_OLD_ENGINE is defined, and `adobe'
+   *   otherwise.
+   *
+   *   The following example code demonstrates how to select Adobe's hinting
+   *   engine for the `cff' module (omitting the error handling).
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_UInt     hinting_engine = FT_CFF_HINTING_ADOBE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "cff",
+   *                               "hinting-engine", &hinting_engine );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   This property can be set via the `FREETYPE_PROPERTIES' environment
+   *   variable (using values `adobe' or `freetype').
+   *
+   * @since:
+   *   2.4.12 (for `cff' module)
+   *
+   *   2.9 (for `type1' and `t1cid' modules)
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   no-stem-darkening
+   *
+   * @description:
+   *   All glyphs that pass through the auto-hinter will be emboldened
+   *   unless this property is set to TRUE.  The same is true for the CFF,
+   *   Type~1, and CID font modules if the `Adobe' engine is selected (which
+   *   is the default).
+   *
+   *   Stem darkening emboldens glyphs at smaller sizes to make them more
+   *   readable on common low-DPI screens when using linear alpha blending
+   *   and gamma correction, see @FT_Render_Glyph.  When not using linear
+   *   alpha blending and gamma correction, glyphs will appear heavy and
+   *   fuzzy!
+   *
+   *   Gamma correction essentially lightens fonts since shades of grey are
+   *   shifted to higher pixel values (=~higher brightness) to match the
+   *   original intention to the reality of our screens.  The side-effect is
+   *   that glyphs `thin out'.  Mac OS~X and Adobe's proprietary font
+   *   rendering library implement a counter-measure: stem darkening at
+   *   smaller sizes where shades of gray dominate.  By emboldening a glyph
+   *   slightly in relation to its pixel size, individual pixels get higher
+   *   coverage of filled-in outlines and are therefore `blacker'.  This
+   *   counteracts the `thinning out' of glyphs, making text remain readable
+   *   at smaller sizes.
+   *
+   *   By default, the Adobe engines for CFF, Type~1, and CID fonts darken
+   *   stems at smaller sizes, regardless of hinting, to enhance contrast. 
+   *   Setting this property, stem darkening gets switched off.
+   *
+   *   For the auto-hinter, stem-darkening is experimental currently and
+   *   thus switched off by default (this is, `no-stem-darkening' is set to
+   *   TRUE by default).  Total consistency with the CFF driver is not
+   *   achieved right now because the emboldening method differs and glyphs
+   *   must be scaled down on the Y-axis to keep outline points inside their
+   *   precomputed blue zones.  The smaller the size (especially 9ppem and
+   *   down), the higher the loss of emboldening versus the CFF driver.
+   *
+   *   Note that stem darkening is never applied if @FT_LOAD_NO_SCALE is
+   *   set.
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Bool     no_stem_darkening = TRUE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "cff",
+   *                               "no-stem-darkening", &no_stem_darkening );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   This property can be set via the `FREETYPE_PROPERTIES' environment
+   *   variable (using values 1 and 0 for `on' and `off', respectively).
+   *   It can also be set per face using @FT_Face_Properties with
+   *   @FT_PARAM_TAG_STEM_DARKENING.
+   *
+   * @since:
+   *   2.4.12 (for `cff' module)
+   *
+   *   2.6.2 (for `autofitter' module)
+   *
+   *   2.9 (for `type1' and `t1cid' modules)
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   darkening-parameters
+   *
+   * @description:
+   *   By default, the Adobe hinting engine, as used by the CFF, Type~1, and
+   *   CID font drivers, darkens stems as follows (if the
+   *   `no-stem-darkening' property isn't set):
+   *
+   *   {
+   *     stem width <= 0.5px:   darkening amount = 0.4px
+   *     stem width  = 1px:     darkening amount = 0.275px
+   *     stem width  = 1.667px: darkening amount = 0.275px
+   *     stem width >= 2.333px: darkening amount = 0px
+   *   }
+   *
+   *   and piecewise linear in-between.  At configuration time, these four
+   *   control points can be set with the macro
+   *   `CFF_CONFIG_OPTION_DARKENING_PARAMETERS'; the CFF, Type~1, and CID
+   *   drivers share these values.  At runtime, the control points can be
+   *   changed using the `darkening-parameters' property, as the following
+   *   example demonstrates for the Type~1 driver.
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Int      darken_params[8] = {  500, 300,   // x1, y1
+   *                                      1000, 200,   // x2, y2
+   *                                      1500, 100,   // x3, y3
+   *                                      2000,   0 }; // x4, y4
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "type1",
+   *                               "darkening-parameters", darken_params );
+   *   }
+   *
+   *   The x~values give the stem width, and the y~values the darkening
+   *   amount.  The unit is 1000th of pixels.  All coordinate values must be
+   *   positive; the x~values must be monotonically increasing; the
+   *   y~values must be monotonically decreasing and smaller than or
+   *   equal to 500 (corresponding to half a pixel); the slope of each
+   *   linear piece must be shallower than -1 (e.g., -.4).
+   *
+   *   The auto-hinter provides this property, too, as an experimental
+   *   feature.  See @no-stem-darkening for more.
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   This property can be set via the `FREETYPE_PROPERTIES' environment
+   *   variable, using eight comma-separated integers without spaces.  Here
+   *   the above example, using `\' to break the line for readability.
+   *
+   *   {
+   *     FREETYPE_PROPERTIES=\
+   *     type1:darkening-parameters=500,300,1000,200,1500,100,2000,0
+   *   }
+   *
+   * @since:
+   *   2.5.1 (for `cff' module)
+   *
+   *   2.6.2 (for `autofitter' module)
+   *
+   *   2.9 (for `type1' and `t1cid' modules)
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   random-seed
+   *
+   * @description:
+   *   By default, the seed value for the CFF `random' operator and the
+   *   similar `0 28 callothersubr pop' command for the Type~1 and CID
+   *   drivers is set to a random value.  However, mainly for debugging
+   *   purposes, it is often necessary to use a known value as a seed so
+   *   that the pseudo-random number sequences generated by `random' are
+   *   repeatable.
+   *
+   *   The `random-seed' property does that.  Its argument is a signed 32bit
+   *   integer; if the value is zero or negative, the seed given by the
+   *   `intitialRandomSeed' private DICT operator in a CFF file gets used
+   *   (or a default value if there is no such operator).  If the value is
+   *   positive, use it instead of `initialRandomSeed', which is
+   *   consequently ignored.
+   *
+   * @note:
+   *   This property can be set via the `FREETYPE_PROPERTIES' environment
+   *   variable.  It can also be set per face using @FT_Face_Properties with
+   *   @FT_PARAM_TAG_RANDOM_SEED.
+   *
+   * @since:
+   *   2.8 (for `cff' module)
+   *
+   *   2.9 (for `type1' and `t1cid' modules)
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   no-long-family-names
+   *
+   * @description:
+   *   If PCF_CONFIG_OPTION_LONG_FAMILY_NAMES is active while compiling
+   *   FreeType, the PCF driver constructs long family names.
+   *
+   *   There are many PCF fonts just called `Fixed' which look completely
+   *   different, and which have nothing to do with each other.  When
+   *   selecting `Fixed' in KDE or Gnome one gets results that appear rather
+   *   random, the style changes often if one changes the size and one
+   *   cannot select some fonts at all.  The improve this situation, the PCF
+   *   module prepends the foundry name (plus a space) to the family name.
+   *   It also checks whether there are `wide' characters; all put together,
+   *   family names like `Sony Fixed' or `Misc Fixed Wide' are constructed.
+   *
+   *   If `no-long-family-names' is set, this feature gets switched off.
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Bool     no_long_family_names = TRUE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "pcf",
+   *                               "no-long-family-names",
+   *                               &no_long_family_names );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   This property can be set via the `FREETYPE_PROPERTIES' environment
+   *   variable (using values 1 and 0 for `on' and `off', respectively).
+   *
+   * @since:
+   *   2.8
+   */
+
+
+  /**************************************************************************
+   *
+   * @enum:
+   *   TT_INTERPRETER_VERSION_XXX
+   *
+   * @description:
+   *   A list of constants used for the @interpreter-version property to
+   *   select the hinting engine for Truetype fonts.
+   *
+   *   The numeric value in the constant names represents the version
+   *   number as returned by the `GETINFO' bytecode instruction.
+   *
+   * @values:
+   *   TT_INTERPRETER_VERSION_35 ::
+   *     Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in
+   *     Windows~98; only grayscale and B/W rasterizing is supported.
+   *
+   *   TT_INTERPRETER_VERSION_38 ::
+   *     Version~38 corresponds to MS rasterizer v.1.9; it is roughly
+   *     equivalent to the hinting provided by DirectWrite ClearType (as can
+   *     be found, for example, in the Internet Explorer~9 running on
+   *     Windows~7).  It is used in FreeType to select the `Infinality'
+   *     subpixel hinting code.  The code may be removed in a future
+   *     version.
+   *
+   *   TT_INTERPRETER_VERSION_40 ::
+   *     Version~40 corresponds to MS rasterizer v.2.1; it is roughly
+   *     equivalent to the hinting provided by DirectWrite ClearType (as can
+   *     be found, for example, in Microsoft's Edge Browser on Windows~10).
+   *     It is used in FreeType to select the `minimal' subpixel hinting
+   *     code, a stripped-down and higher performance version of the
+   *     `Infinality' code.
+   *
+   * @note:
+   *   This property controls the behaviour of the bytecode interpreter
+   *   and thus how outlines get hinted.  It does *not* control how glyph
+   *   get rasterized!  In particular, it does not control subpixel color
+   *   filtering.
+   *
+   *   If FreeType has not been compiled with the configuration option
+   *   TT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 or~40 causes
+   *   an `FT_Err_Unimplemented_Feature' error.
+   *
+   *   Depending on the graphics framework, Microsoft uses different
+   *   bytecode and rendering engines.  As a consequence, the version
+   *   numbers returned by a call to the `GETINFO' bytecode instruction are
+   *   more convoluted than desired.
+   *
+   *   Here are two tables that try to shed some light on the possible
+   *   values for the MS rasterizer engine, together with the additional
+   *   features introduced by it.
+   *
+   *   {
+   *     GETINFO framework               version feature
+   *     -------------------------------------------------------------------
+   *         3   GDI (Win 3.1),            v1.0  16-bit, first version
+   *             TrueImage
+   *        33   GDI (Win NT 3.1),         v1.5  32-bit
+   *             HP Laserjet
+   *        34   GDI (Win 95)              v1.6  font smoothing,
+   *                                             new SCANTYPE opcode
+   *        35   GDI (Win 98/2000)         v1.7  (UN)SCALED_COMPONENT_OFFSET
+   *                                               bits in composite glyphs
+   *        36   MGDI (Win CE 2)           v1.6+ classic ClearType
+   *        37   GDI (XP and later),       v1.8  ClearType
+   *             GDI+ old (before Vista)
+   *        38   GDI+ old (Vista, Win 7),  v1.9  subpixel ClearType,
+   *             WPF                             Y-direction ClearType,
+   *                                             additional error checking
+   *        39   DWrite (before Win 8)     v2.0  subpixel ClearType flags
+   *                                               in GETINFO opcode,
+   *                                             bug fixes
+   *        40   GDI+ (after Win 7),       v2.1  Y-direction ClearType flag
+   *             DWrite (Win 8)                    in GETINFO opcode,
+   *                                             Gray ClearType
+   *   }
+   *
+   *   The `version' field gives a rough orientation only, since some
+   *   applications provided certain features much earlier (as an example,
+   *   Microsoft Reader used subpixel and Y-direction ClearType already in
+   *   Windows 2000).  Similarly, updates to a given framework might include
+   *   improved hinting support.
+   *
+   *   {
+   *      version   sampling          rendering        comment
+   *               x        y       x           y
+   *     --------------------------------------------------------------
+   *       v1.0   normal  normal  B/W           B/W    bi-level
+   *       v1.6   high    high    gray          gray   grayscale
+   *       v1.8   high    normal  color-filter  B/W    (GDI) ClearType
+   *       v1.9   high    high    color-filter  gray   Color ClearType
+   *       v2.1   high    normal  gray          B/W    Gray ClearType
+   *       v2.1   high    high    gray          gray   Gray ClearType
+   *   }
+   *
+   *   Color and Gray ClearType are the two available variants of
+   *   `Y-direction ClearType', meaning grayscale rasterization along the
+   *   Y-direction; the name used in the TrueType specification for this
+   *   feature is `symmetric smoothing'.  `Classic ClearType' is the
+   *   original algorithm used before introducing a modified version in
+   *   Win~XP.  Another name for v1.6's grayscale rendering is `font
+   *   smoothing', and `Color ClearType' is sometimes also called `DWrite
+   *   ClearType'.  To differentiate between today's Color ClearType and the
+   *   earlier ClearType variant with B/W rendering along the vertical axis,
+   *   the latter is sometimes called `GDI ClearType'.
+   *
+   *   `Normal' and `high' sampling describe the (virtual) resolution to
+   *   access the rasterized outline after the hinting process.  `Normal'
+   *   means 1 sample per grid line (i.e., B/W).  In the current Microsoft
+   *   implementation, `high' means an extra virtual resolution of 16x16 (or
+   *   16x1) grid lines per pixel for bytecode instructions like `MIRP'.
+   *   After hinting, these 16 grid lines are mapped to 6x5 (or 6x1) grid
+   *   lines for color filtering if Color ClearType is activated.
+   *
+   *   Note that `Gray ClearType' is essentially the same as v1.6's
+   *   grayscale rendering.  However, the GETINFO instruction handles it
+   *   differently: v1.6 returns bit~12 (hinting for grayscale), while v2.1
+   *   returns bits~13 (hinting for ClearType), 18 (symmetrical smoothing),
+   *   and~19 (Gray ClearType).  Also, this mode respects bits 2 and~3 for
+   *   the version~1 gasp table exclusively (like Color ClearType), while
+   *   v1.6 only respects the values of version~0 (bits 0 and~1).
+   *
+   *   Keep in mind that the features of the above interpreter versions
+   *   might not map exactly to FreeType features or behavior because it is
+   *   a fundamentally different library with different internals.
+   *
+   */
+#define TT_INTERPRETER_VERSION_35  35
+#define TT_INTERPRETER_VERSION_38  38
+#define TT_INTERPRETER_VERSION_40  40
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   interpreter-version
+   *
+   * @description:
+   *   Currently, three versions are available, two representing the
+   *   bytecode interpreter with subpixel hinting support (old `Infinality'
+   *   code and new stripped-down and higher performance `minimal' code) and
+   *   one without, respectively.  The default is subpixel support if
+   *   TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel support
+   *   otherwise (since it isn't available then).
+   *
+   *   If subpixel hinting is on, many TrueType bytecode instructions behave
+   *   differently compared to B/W or grayscale rendering (except if `native
+   *   ClearType' is selected by the font).  Microsoft's main idea is to
+   *   render at a much increased horizontal resolution, then sampling down
+   *   the created output to subpixel precision.  However, many older fonts
+   *   are not suited to this and must be specially taken care of by
+   *   applying (hardcoded) tweaks in Microsoft's interpreter.
+   *
+   *   Details on subpixel hinting and some of the necessary tweaks can be
+   *   found in Greg Hitchcock's whitepaper at
+   *   `https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'.
+   *   Note that FreeType currently doesn't really `subpixel hint' (6x1, 6x2,
+   *   or 6x5 supersampling) like discussed in the paper.  Depending on the
+   *   chosen interpreter, it simply ignores instructions on vertical stems
+   *   to arrive at very similar results.
+   *
+   *   The following example code demonstrates how to deactivate subpixel
+   *   hinting (omitting the error handling).
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Face     face;
+   *     FT_UInt     interpreter_version = TT_INTERPRETER_VERSION_35;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "truetype",
+   *                               "interpreter-version",
+   *                               &interpreter_version );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   This property can be set via the `FREETYPE_PROPERTIES' environment
+   *   variable (using values `35', `38', or `40').
+   *
+   * @since:
+   *   2.5
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   glyph-to-script-map
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   The auto-hinter provides various script modules to hint glyphs.
+   *   Examples of supported scripts are Latin or CJK.  Before a glyph is
+   *   auto-hinted, the Unicode character map of the font gets examined, and
+   *   the script is then determined based on Unicode character ranges, see
+   *   below.
+   *
+   *   OpenType fonts, however, often provide much more glyphs than
+   *   character codes (small caps, superscripts, ligatures, swashes, etc.),
+   *   to be controlled by so-called `features'.  Handling OpenType features
+   *   can be quite complicated and thus needs a separate library on top of
+   *   FreeType.
+   *
+   *   The mapping between glyph indices and scripts (in the auto-hinter
+   *   sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an
+   *   array with `num_glyphs' elements, as found in the font's @FT_Face
+   *   structure.  The `glyph-to-script-map' property returns a pointer to
+   *   this array, which can be modified as needed.  Note that the
+   *   modification should happen before the first glyph gets processed by
+   *   the auto-hinter so that the global analysis of the font shapes
+   *   actually uses the modified mapping.
+   *
+   *   The following example code demonstrates how to access it (omitting
+   *   the error handling).
+   *
+   *   {
+   *     FT_Library                library;
+   *     FT_Face                   face;
+   *     FT_Prop_GlyphToScriptMap  prop;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *     FT_New_Face( library, "foo.ttf", 0, &face );
+   *
+   *     prop.face = face;
+   *
+   *     FT_Property_Get( library, "autofitter",
+   *                               "glyph-to-script-map", &prop );
+   *
+   *     // adjust `prop.map' as needed right here
+   *
+   *     FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );
+   *   }
+   *
+   * @since:
+   *   2.4.11
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @enum:
+   *   FT_AUTOHINTER_SCRIPT_XXX
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   A list of constants used for the @glyph-to-script-map property to
+   *   specify the script submodule the auto-hinter should use for hinting a
+   *   particular glyph.
+   *
+   * @values:
+   *   FT_AUTOHINTER_SCRIPT_NONE ::
+   *     Don't auto-hint this glyph.
+   *
+   *   FT_AUTOHINTER_SCRIPT_LATIN ::
+   *     Apply the latin auto-hinter.  For the auto-hinter, `latin' is a
+   *     very broad term, including Cyrillic and Greek also since characters
+   *     from those scripts share the same design constraints.
+   *
+   *     By default, characters from the following Unicode ranges are
+   *     assigned to this submodule.
+   *
+   *     {
+   *       U+0020 - U+007F  // Basic Latin (no control characters)
+   *       U+00A0 - U+00FF  // Latin-1 Supplement (no control characters)
+   *       U+0100 - U+017F  // Latin Extended-A
+   *       U+0180 - U+024F  // Latin Extended-B
+   *       U+0250 - U+02AF  // IPA Extensions
+   *       U+02B0 - U+02FF  // Spacing Modifier Letters
+   *       U+0300 - U+036F  // Combining Diacritical Marks
+   *       U+0370 - U+03FF  // Greek and Coptic
+   *       U+0400 - U+04FF  // Cyrillic
+   *       U+0500 - U+052F  // Cyrillic Supplement
+   *       U+1D00 - U+1D7F  // Phonetic Extensions
+   *       U+1D80 - U+1DBF  // Phonetic Extensions Supplement
+   *       U+1DC0 - U+1DFF  // Combining Diacritical Marks Supplement
+   *       U+1E00 - U+1EFF  // Latin Extended Additional
+   *       U+1F00 - U+1FFF  // Greek Extended
+   *       U+2000 - U+206F  // General Punctuation
+   *       U+2070 - U+209F  // Superscripts and Subscripts
+   *       U+20A0 - U+20CF  // Currency Symbols
+   *       U+2150 - U+218F  // Number Forms
+   *       U+2460 - U+24FF  // Enclosed Alphanumerics
+   *       U+2C60 - U+2C7F  // Latin Extended-C
+   *       U+2DE0 - U+2DFF  // Cyrillic Extended-A
+   *       U+2E00 - U+2E7F  // Supplemental Punctuation
+   *       U+A640 - U+A69F  // Cyrillic Extended-B
+   *       U+A720 - U+A7FF  // Latin Extended-D
+   *       U+FB00 - U+FB06  // Alphab. Present. Forms (Latin Ligatures)
+   *      U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols
+   *      U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement
+   *     }
+   *
+   *   FT_AUTOHINTER_SCRIPT_CJK ::
+   *     Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old
+   *     Vietnamese, and some other scripts.
+   *
+   *     By default, characters from the following Unicode ranges are
+   *     assigned to this submodule.
+   *
+   *     {
+   *       U+1100 - U+11FF  // Hangul Jamo
+   *       U+2E80 - U+2EFF  // CJK Radicals Supplement
+   *       U+2F00 - U+2FDF  // Kangxi Radicals
+   *       U+2FF0 - U+2FFF  // Ideographic Description Characters
+   *       U+3000 - U+303F  // CJK Symbols and Punctuation
+   *       U+3040 - U+309F  // Hiragana
+   *       U+30A0 - U+30FF  // Katakana
+   *       U+3100 - U+312F  // Bopomofo
+   *       U+3130 - U+318F  // Hangul Compatibility Jamo
+   *       U+3190 - U+319F  // Kanbun
+   *       U+31A0 - U+31BF  // Bopomofo Extended
+   *       U+31C0 - U+31EF  // CJK Strokes
+   *       U+31F0 - U+31FF  // Katakana Phonetic Extensions
+   *       U+3200 - U+32FF  // Enclosed CJK Letters and Months
+   *       U+3300 - U+33FF  // CJK Compatibility
+   *       U+3400 - U+4DBF  // CJK Unified Ideographs Extension A
+   *       U+4DC0 - U+4DFF  // Yijing Hexagram Symbols
+   *       U+4E00 - U+9FFF  // CJK Unified Ideographs
+   *       U+A960 - U+A97F  // Hangul Jamo Extended-A
+   *       U+AC00 - U+D7AF  // Hangul Syllables
+   *       U+D7B0 - U+D7FF  // Hangul Jamo Extended-B
+   *       U+F900 - U+FAFF  // CJK Compatibility Ideographs
+   *       U+FE10 - U+FE1F  // Vertical forms
+   *       U+FE30 - U+FE4F  // CJK Compatibility Forms
+   *       U+FF00 - U+FFEF  // Halfwidth and Fullwidth Forms
+   *      U+1B000 - U+1B0FF // Kana Supplement
+   *      U+1D300 - U+1D35F // Tai Xuan Hing Symbols
+   *      U+1F200 - U+1F2FF // Enclosed Ideographic Supplement
+   *      U+20000 - U+2A6DF // CJK Unified Ideographs Extension B
+   *      U+2A700 - U+2B73F // CJK Unified Ideographs Extension C
+   *      U+2B740 - U+2B81F // CJK Unified Ideographs Extension D
+   *      U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement
+   *     }
+   *
+   *   FT_AUTOHINTER_SCRIPT_INDIC ::
+   *     Apply the indic auto-hinter, covering all major scripts from the
+   *     Indian sub-continent and some other related scripts like Thai, Lao,
+   *     or Tibetan.
+   *
+   *     By default, characters from the following Unicode ranges are
+   *     assigned to this submodule.
+   *
+   *     {
+   *       U+0900 - U+0DFF  // Indic Range
+   *       U+0F00 - U+0FFF  // Tibetan
+   *       U+1900 - U+194F  // Limbu
+   *       U+1B80 - U+1BBF  // Sundanese
+   *       U+A800 - U+A82F  // Syloti Nagri
+   *       U+ABC0 - U+ABFF  // Meetei Mayek
+   *      U+11800 - U+118DF // Sharada
+   *     }
+   *
+   *     Note that currently Indic support is rudimentary only, missing blue
+   *     zone support.
+   *
+   * @since:
+   *   2.4.11
+   *
+   */
+#define FT_AUTOHINTER_SCRIPT_NONE   0
+#define FT_AUTOHINTER_SCRIPT_LATIN  1
+#define FT_AUTOHINTER_SCRIPT_CJK    2
+#define FT_AUTOHINTER_SCRIPT_INDIC  3
+
+
+  /**************************************************************************
+   *
+   * @struct:
+   *   FT_Prop_GlyphToScriptMap
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   The data exchange structure for the @glyph-to-script-map property.
+   *
+   * @since:
+   *   2.4.11
+   *
+   */
+  typedef struct  FT_Prop_GlyphToScriptMap_
+  {
+    FT_Face     face;
+    FT_UShort*  map;
+
+  } FT_Prop_GlyphToScriptMap;
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   fallback-script
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   If no auto-hinter script module can be assigned to a glyph, a
+   *   fallback script gets assigned to it (see also the
+   *   @glyph-to-script-map property).  By default, this is
+   *   @FT_AUTOHINTER_SCRIPT_CJK.  Using the `fallback-script' property,
+   *   this fallback value can be changed.
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_UInt     fallback_script = FT_AUTOHINTER_SCRIPT_NONE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "autofitter",
+   *                               "fallback-script", &fallback_script );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   It's important to use the right timing for changing this value: The
+   *   creation of the glyph-to-script map that eventually uses the
+   *   fallback script value gets triggered either by setting or reading a
+   *   face-specific property like @glyph-to-script-map, or by auto-hinting
+   *   any glyph from that face.  In particular, if you have already created
+   *   an @FT_Face structure but not loaded any glyph (using the
+   *   auto-hinter), a change of the fallback script will affect this face.
+   *
+   * @since:
+   *   2.4.11
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   default-script
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   If FreeType gets compiled with FT_CONFIG_OPTION_USE_HARFBUZZ to make
+   *   the HarfBuzz library access OpenType features for getting better
+   *   glyph coverages, this property sets the (auto-fitter) script to be
+   *   used for the default (OpenType) script data of a font's GSUB table.
+   *   Features for the default script are intended for all scripts not
+   *   explicitly handled in GSUB; an example is a `dlig' feature,
+   *   containing the combination of the characters `T', `E', and `L' to
+   *   form a `TEL' ligature.
+   *
+   *   By default, this is @FT_AUTOHINTER_SCRIPT_LATIN.  Using the
+   *   `default-script' property, this default value can be changed.
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_UInt     default_script = FT_AUTOHINTER_SCRIPT_NONE;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "autofitter",
+   *                               "default-script", &default_script );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   It's important to use the right timing for changing this value: The
+   *   creation of the glyph-to-script map that eventually uses the
+   *   default script value gets triggered either by setting or reading a
+   *   face-specific property like @glyph-to-script-map, or by auto-hinting
+   *   any glyph from that face.  In particular, if you have already created
+   *   an @FT_Face structure but not loaded any glyph (using the
+   *   auto-hinter), a change of the default script will affect this face.
+   *
+   * @since:
+   *   2.5.3
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   increase-x-height
+   *
+   * @description:
+   *   For ppem values in the range 6~<= ppem <= `increase-x-height', round
+   *   up the font's x~height much more often than normally.  If the value
+   *   is set to~0, which is the default, this feature is switched off.  Use
+   *   this property to improve the legibility of small font sizes if
+   *   necessary.
+   *
+   *   {
+   *     FT_Library               library;
+   *     FT_Face                  face;
+   *     FT_Prop_IncreaseXHeight  prop;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *     FT_New_Face( library, "foo.ttf", 0, &face );
+   *     FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );
+   *
+   *     prop.face  = face;
+   *     prop.limit = 14;
+   *
+   *     FT_Property_Set( library, "autofitter",
+   *                               "increase-x-height", &prop );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   Set this value right after calling @FT_Set_Char_Size, but before
+   *   loading any glyph (using the auto-hinter).
+   *
+   * @since:
+   *   2.4.11
+   *
+   */
+
+
+  /**************************************************************************
+   *
+   * @struct:
+   *   FT_Prop_IncreaseXHeight
+   *
+   * @description:
+   *   The data exchange structure for the @increase-x-height property.
+   *
+   */
+  typedef struct  FT_Prop_IncreaseXHeight_
+  {
+    FT_Face  face;
+    FT_UInt  limit;
+
+  } FT_Prop_IncreaseXHeight;
+
+
+  /**************************************************************************
+   *
+   * @property:
+   *   warping
+   *
+   * @description:
+   *   *Experimental* *only*
+   *
+   *   If FreeType gets compiled with option AF_CONFIG_OPTION_USE_WARPER to
+   *   activate the warp hinting code in the auto-hinter, this property
+   *   switches warping on and off.
+   *
+   *   Warping only works in `normal' auto-hinting mode replacing it.
+   *   The idea of the code is to slightly scale and shift a glyph along
+   *   the non-hinted dimension (which is usually the horizontal axis) so
+   *   that as much of its segments are aligned (more or less) to the grid.
+   *   To find out a glyph's optimal scaling and shifting value, various
+   *   parameter combinations are tried and scored.
+   *
+   *   By default, warping is off.  The example below shows how to switch on
+   *   warping (omitting the error handling).
+   *
+   *   {
+   *     FT_Library  library;
+   *     FT_Bool     warping = 1;
+   *
+   *
+   *     FT_Init_FreeType( &library );
+   *
+   *     FT_Property_Set( library, "autofitter",
+   *                               "warping", &warping );
+   *   }
+   *
+   * @note:
+   *   This property can be used with @FT_Property_Get also.
+   *
+   *   This property can be set via the `FREETYPE_PROPERTIES' environment
+   *   variable (using values 1 and 0 for `on' and `off', respectively).
+   *
+   *   The warping code can also change advance widths.  Have a look at the
+   *   `lsb_delta' and `rsb_delta' fields in the @FT_GlyphSlotRec structure
+   *   for details on improving inter-glyph distances while rendering.
+   *
+   *   Since warping is a global property of the auto-hinter it is best to
+   *   change its value before rendering any face.  Otherwise, you should
+   *   reload all faces that get auto-hinted in `normal' hinting mode.
+   *
+   * @since:
+   *   2.6
+   *
+   */
+
+
+ /* */
+
+
+FT_END_HEADER
+
+
+#endif /* FTDRIVER_H_ */
+
+
+/* END */
index cabbac8..8ffd346 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType error codes (specification).                                */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
                 "invalid PostScript (post) table" )
   FT_ERRORDEF_( DEF_In_Glyf_Bytecode,                        0x9C,
                 "found FDEF or IDEF opcode in glyf bytecode" )
+  FT_ERRORDEF_( Missing_Bitmap,                              0x9D,
+                "missing bitmap in strike" )
 
   /* CFF, CID, and Type 1 errors */
 
index 42769fa..f6ee5c2 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType error code handling (specification).                        */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
   /*   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&nbsp;2, however).  See the file    */
+  /*   with standard builds of FreeType~2, however).  See the file         */
   /*   `ftmoderr.h' for more details.                                      */
   /*                                                                       */
   /*   *Error* *Message* *Strings*                                         */
   /*                                                                       */
   /*   Error definitions are set up with special macros that allow client  */
   /*   applications to build a table of error message strings.  The        */
-  /*   strings are not included in a normal build of FreeType&nbsp;2 to    */
-  /*   save space (most client applications do not use them).              */
+  /*   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.                                                          */
index 3377583..cc86efa 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Support functions for font formats.                                  */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index ce18d64..9b54fc8 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Access of TrueType's `gasp' table (specification).                   */
 /*                                                                         */
-/*  Copyright 2007-2017 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 79879a7..5f3fc00 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType convenience functions to handle glyphs (specification).     */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -231,6 +231,12 @@ FT_BEGIN_HEADER
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
   /*                                                                       */
+  /* <Note>                                                                */
+  /*    Because `*aglyph->advance.x' and '*aglyph->advance.y' are 16.16    */
+  /*    fixed-point numbers, `slot->advance.x' and `slot->advance.y'       */
+  /*    (which are in 26.6 fixed-point format) must be in the range        */
+  /*    ]-32768;32768[.                                                    */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Get_Glyph( FT_GlyphSlot  slot,
                 FT_Glyph     *aglyph );
@@ -341,10 +347,10 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /* <Description>                                                         */
   /*    Return a glyph's `control box'.  The control box encloses all the  */
-  /*    outline's points, including Bézier control points.  Though it      */
+  /*    outline's points, including Bezier 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  */
-  /*    that contains Bézier outside arcs).                                */
+  /*    that contains Bezier 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  */
@@ -566,6 +572,9 @@ FT_BEGIN_HEADER
   /* <Note>                                                                */
   /*    The result is undefined if either `a' or `b' is zero.              */
   /*                                                                       */
+  /*    Since the function uses wrap-around arithmetic, results become     */
+  /*    meaningless if the arguments are very large.                       */
+  /*                                                                       */
   FT_EXPORT( void )
   FT_Matrix_Multiply( const FT_Matrix*  a,
                       FT_Matrix*        b );
index f239c71..8382d59 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  Masatake YAMATO, Redhat K.K,                                           */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
@@ -101,15 +101,15 @@ FT_BEGIN_HEADER
    *   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)
+#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 )
+#define FT_VALIDATE_GX_START  0x4000
+#define FT_VALIDATE_GX_BITFIELD( tag ) \
+          ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX )
 
 
  /**********************************************************************
index bd5ceaa..db033da 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Gzip-compressed stream support.                                      */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -129,6 +129,9 @@ FT_BEGIN_HEADER
   * @note:
   *   This function may return `FT_Err_Unimplemented_Feature' if your build
   *   of FreeType was not compiled with zlib support.
+  *
+  * @since:
+  *   2.5.1
   */
   FT_EXPORT( FT_Error )
   FT_Gzip_Uncompress( FT_Memory       memory,
index 1a049ef..79ede19 100644 (file)
@@ -5,7 +5,7 @@
 /*    FreeType glyph image formats and default raster interface            */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -169,13 +169,13 @@ FT_BEGIN_HEADER
   /*      @FT_RENDER_MODE_LCD_V.                                           */
   /*                                                                       */
   /*    FT_PIXEL_MODE_BGRA ::                                              */
-  /*      An image with four 8-bit channels per pixel, representing a      */
-  /*      color image (such as emoticons) with alpha channel.  For each    */
-  /*      pixel, the format is BGRA, which means, the blue channel comes   */
-  /*      first in memory.  The color channels are pre-multiplied and in   */
-  /*      the sRGB colorspace.  For example, full red at half-translucent  */
-  /*      opacity will be represented as `00,00,80,80', not `00,00,FF,80'. */
-  /*      See also @FT_LOAD_COLOR.                                         */
+  /*      [Since 2.5] An image with four 8-bit channels per pixel,         */
+  /*      representing a color image (such as emoticons) with alpha        */
+  /*      channel.  For each pixel, the format is BGRA, which means, the   */
+  /*      blue channel comes first in memory.  The color channels are      */
+  /*      pre-multiplied and in the sRGB colorspace.  For example, full    */
+  /*      red at half-translucent opacity will be represented as           */
+  /*      `00,00,80,80', not `00,00,FF,80'.  See also @FT_LOAD_COLOR.      */
   /*                                                                       */
   typedef enum  FT_Pixel_Mode_
   {
@@ -301,11 +301,11 @@ FT_BEGIN_HEADER
   /*                  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    */
+  /*                  i.e., a Bezier 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; */
+  /*                  it indicates a third-order Bezier arc control point; */
   /*                  and a second-order control point if unset.           */
   /*                                                                       */
   /*                  If bit~2 is set, bits 5-7 contain the drop-out mode  */
@@ -532,7 +532,7 @@ FT_BEGIN_HEADER
   /*    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   */
+  /*    A `conic to' is emitted to indicate a second-order Bezier arc in   */
   /*    the outline.                                                       */
   /*                                                                       */
   /* <Input>                                                               */
@@ -564,12 +564,12 @@ FT_BEGIN_HEADER
   /*    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.      */
+  /*    A `cubic to' is emitted to indicate a third-order Bezier arc.      */
   /*                                                                       */
   /* <Input>                                                               */
-  /*    control1 :: A pointer to the first Bézier control point.           */
+  /*    control1 :: A pointer to the first Bezier control point.           */
   /*                                                                       */
-  /*    control2 :: A pointer to the second Bézier control point.          */
+  /*    control2 :: A pointer to the second Bezier control point.          */
   /*                                                                       */
   /*    to       :: A pointer to the target end point.                     */
   /*                                                                       */
@@ -595,16 +595,16 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /* <Description>                                                         */
   /*    A structure to hold various function pointers used during outline  */
-  /*    decomposition in order to emit segments, conic, and cubic Béziers. */
+  /*    decomposition in order to emit segments, conic, and cubic Beziers. */
   /*                                                                       */
   /* <Fields>                                                              */
   /*    move_to  :: The `move to' emitter.                                 */
   /*                                                                       */
   /*    line_to  :: The segment emitter.                                   */
   /*                                                                       */
-  /*    conic_to :: The second-order Bézier arc emitter.                   */
+  /*    conic_to :: The second-order Bezier arc emitter.                   */
   /*                                                                       */
-  /*    cubic_to :: The third-order Bézier arc emitter.                    */
+  /*    cubic_to :: The third-order Bezier arc emitter.                    */
   /*                                                                       */
   /*    shift    :: The shift that is applied to coordinates before they   */
   /*                are sent to the emitter.                               */
@@ -701,7 +701,7 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /*    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      */
+  /*      and Bezier 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.                           */
   /*                                                                       */
@@ -1064,24 +1064,24 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /* <Description>                                                         */
   /*    FreeType used to provide an area of memory called the `render      */
-  /*    pool' available to all registered rasters.  This was not thread    */
-  /*    safe however and now FreeType never allocates this pool.  NULL     */
-  /*    is always passed in as pool_base.                                  */
+  /*    pool' available to all registered rasterizers.  This was not       */
+  /*    thread safe, however, and now FreeType never allocates this pool.  */
   /*                                                                       */
-  /*    This function is called each time the render pool changes, or just */
-  /*    after a new raster object is created.                              */
+  /*    This function is called 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_base :: Previously, the address in memory of the render pool. */
+  /*                 Set this to NULL.                                     */
   /*                                                                       */
-  /*    pool_size :: The size in bytes of the render pool.                 */
+  /*    pool_size :: Previously, the size in bytes of the render pool.     */
+  /*                 Set this to 0.                                        */
   /*                                                                       */
   /* <Note>                                                                */
-  /*    Rasters should ignore the render pool and rely on dynamic or stack */
-  /*    allocation if they want to (a handle to the memory allocator is    */
-  /*    passed to the raster constructor).                                 */
+  /*    Rasterizers should rely on dynamic or stack allocation if they     */
+  /*    want to (a handle to the memory allocator is passed to the         */
+  /*    rasterizer constructor).                                           */
   /*                                                                       */
   typedef void
   (*FT_Raster_ResetFunc)( FT_Raster       raster,
index f6ae2ba..44619f9 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType incremental loading (specification).                        */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -21,6 +21,7 @@
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
+#include FT_PARAMETER_TAGS_H
 
 #ifdef FREETYPE_H
 #error "freetype.h of FreeType 1 has been loaded!"
@@ -331,18 +332,6 @@ FT_BEGIN_HEADER
   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' )
-
   /* */
 
 
index 680bd90..2a27196 100644 (file)
@@ -5,7 +5,7 @@
 /*    FreeType API for color filtering of subpixel bitmap glyphs           */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,6 +22,7 @@
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
+#include FT_PARAMETER_TAGS_H
 
 #ifdef FREETYPE_H
 #error "freetype.h of FreeType 1 has been loaded!"
@@ -44,9 +45,16 @@ FT_BEGIN_HEADER
    *   Reduce color fringes of subpixel-rendered bitmaps.
    *
    * @description:
-   *   Subpixel rendering exploits the color-striped structure of LCD
-   *   pixels, increasing the available resolution in the direction of the
-   *   stripe (usually horizontal RGB) by a factor of~3.  Since these
+   *   Should you #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING in your
+   *   `ftoption.h', which enables patented ClearType-style rendering,
+   *   the LCD-optimized glyph bitmaps should be filtered to reduce color
+   *   fringes inherent to this technology.  The default FreeType LCD
+   *   rendering uses different technology, and API described below,
+   *   although available, does nothing.
+   *
+   *   ClearType-style LCD rendering exploits the color-striped structure of
+   *   LCD pixels, increasing the available resolution in the direction of
+   *   the stripe (usually horizontal RGB) by a factor of~3.  Since these
    *   subpixels are color pixels, using them unfiltered creates severe
    *   color fringes.  Use the @FT_Library_SetLcdFilter API to specify a
    *   low-pass filter, which is then applied to subpixel-rendered bitmaps
@@ -54,12 +62,6 @@ FT_BEGIN_HEADER
    *   the higher resolution to reduce color fringes, making the glyph image
    *   slightly blurrier.  Positional improvements will remain.
    *
-   *   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 and explicitly call @FT_Library_SetLcdFilter
-   *   to enable it.
-   *
    *   A filter should have two properties:
    *
    *   1) It should be normalized, meaning the sum of the 5~components
@@ -279,23 +281,6 @@ FT_BEGIN_HEADER
                                   unsigned char  *weights );
 
 
-  /**************************************************************************
-   *
-   * @constant:
-   *   FT_PARAM_TAG_LCD_FILTER_WEIGHTS
-   *
-   * @description:
-   *   An @FT_Parameter tag to be used with @FT_Face_Properties.  The
-   *   corresponding argument specifies the five LCD filter weights for a
-   *   given face (if using @FT_LOAD_TARGET_LCD, for example), overriding
-   *   the global default values or the values set up with
-   *   @FT_Library_SetLcdFilterWeights.
-   *
-   */
-#define FT_PARAM_TAG_LCD_FILTER_WEIGHTS \
-          FT_MAKE_TAG( 'l', 'c', 'd', 'f' )
-
-
   /*
    * @type:
    *   FT_LcdFiveTapFilter
@@ -304,6 +289,9 @@ FT_BEGIN_HEADER
    *   A typedef for passing the five LCD filter weights to
    *   @FT_Face_Properties within an @FT_Parameter structure.
    *
+   * @since:
+   *   2.8
+   *
    */
 #define FT_LCD_FILTER_FIVE_TAPS  5
 
index 5309cb1..117473b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Generic list support for FreeType (specification).                   */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index a82c95e..1615912 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    LZW-compressed stream support.                                       */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index ad97c6e..c1e497c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Additional Mac-specific API.                                         */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.     */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 FT_BEGIN_HEADER
 
 
-/* gcc-3.4.1 and later can warn about functions tagged as deprecated */
+  /* gcc-3.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))
+#if defined( __GNUC__ )                                     && \
+    ( ( __GNUC__ >= 4 )                                  ||    \
+      ( ( __GNUC__ == 3 ) && ( __GNUC_MINOR__ >= 1 ) ) )
+#define FT_DEPRECATED_ATTRIBUTE  __attribute__(( deprecated ))
 #else
 #define FT_DEPRECATED_ATTRIBUTE
 #endif
index c41b80e..9948102 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Multiple Master font interface (specification).             */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -178,7 +178,8 @@ FT_BEGIN_HEADER
   /*    strid  :: The entry in `name' table identifying this instance.     */
   /*                                                                       */
   /*    psid   :: The entry in `name' table identifying a PostScript name  */
-  /*              for this instance.                                       */
+  /*              for this instance.  Value 0xFFFF indicates a missing     */
+  /*              entry.                                                   */
   /*                                                                       */
   typedef struct  FT_Var_Named_Style_
   {
@@ -195,7 +196,7 @@ FT_BEGIN_HEADER
   /*    FT_MM_Var                                                          */
   /*                                                                       */
   /* <Description>                                                         */
-  /*    A structure to model the axes and space of a Adobe MM, TrueType    */
+  /*    A structure to model the axes and space of an Adobe MM, TrueType   */
   /*    GX, or OpenType variation font.                                    */
   /*                                                                       */
   /*    Some fields are specific to one format and not to the others.      */
@@ -285,7 +286,7 @@ FT_BEGIN_HEADER
   /* <Output>                                                              */
   /*    amaster :: The variation descriptor.                               */
   /*               Allocates a data structure, which the user must         */
-  /*               deallocate with `free' after use.                       */
+  /*               deallocate with a call to @FT_Done_MM_Var after use.    */
   /*                                                                       */
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
@@ -298,6 +299,26 @@ FT_BEGIN_HEADER
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
+  /*    FT_Done_MM_Var                                                     */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Free the memory allocated by @FT_Get_MM_Var.                       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    library :: A handle of the face's parent library object that was   */
+  /*               used in the call to @FT_Get_MM_Var to create `amaster'. */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Done_MM_Var( FT_Library   library,
+                  FT_MM_Var   *amaster );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
   /*    FT_Set_MM_Design_Coordinates                                       */
   /*                                                                       */
   /* <Description>                                                         */
@@ -321,6 +342,15 @@ FT_BEGIN_HEADER
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
   /*                                                                       */
+  /* <Note>                                                                */
+  /*    [Since 2.8.1] To reset all axes to the default values, call the    */
+  /*    function with `num_coords' set to zero and `coords' set to NULL.   */
+  /*                                                                       */
+  /*    [Since 2.9] If `num_coords' is larger than zero, this function     */
+  /*    sets the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags'    */
+  /*    field (i.e., @FT_IS_VARIATION will return true).  If `num_coords'  */
+  /*    is zero, this bit flag gets unset.                                 */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Set_MM_Design_Coordinates( FT_Face   face,
                                 FT_UInt   num_coords,
@@ -351,6 +381,17 @@ FT_BEGIN_HEADER
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
   /*                                                                       */
+  /* <Note>                                                                */
+  /*    [Since 2.8.1] To reset all axes to the default values, call the    */
+  /*    function with `num_coords' set to zero and `coords' set to NULL.   */
+  /*    [Since 2.9] `Default values' means the currently selected named    */
+  /*    instance (or the base font if no named instance is selected).      */
+  /*                                                                       */
+  /*    [Since 2.9] If `num_coords' is larger than zero, this function     */
+  /*    sets the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags'    */
+  /*    field (i.e., @FT_IS_VARIATION will return true).  If `num_coords'  */
+  /*    is zero, this bit flag gets unset.                                 */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Set_Var_Design_Coordinates( FT_Face    face,
                                  FT_UInt    num_coords,
@@ -381,6 +422,9 @@ FT_BEGIN_HEADER
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
   /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.7.1                                                              */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Get_Var_Design_Coordinates( FT_Face    face,
                                  FT_UInt    num_coords,
@@ -415,6 +459,17 @@ FT_BEGIN_HEADER
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
   /*                                                                       */
+  /* <Note>                                                                */
+  /*    [Since 2.8.1] To reset all axes to the default values, call the    */
+  /*    function with `num_coords' set to zero and `coords' set to NULL.   */
+  /*    [Since 2.9] `Default values' means the currently selected named    */
+  /*    instance (or the base font if no named instance is selected).      */
+  /*                                                                       */
+  /*    [Since 2.9] If `num_coords' is larger than zero, this function     */
+  /*    sets the @FT_FACE_FLAG_VARIATION bit in @FT_Face's `face_flags'    */
+  /*    field (i.e., @FT_IS_VARIATION will return true).  If `num_coords'  */
+  /*    is zero, this bit flag gets unset.                                 */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Set_MM_Blend_Coordinates( FT_Face    face,
                                FT_UInt    num_coords,
@@ -446,6 +501,9 @@ FT_BEGIN_HEADER
   /* <Return>                                                              */
   /*    FreeType error code.  0~means success.                             */
   /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.7.1                                                              */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Get_MM_Blend_Coordinates( FT_Face    face,
                                FT_UInt    num_coords,
@@ -474,11 +532,101 @@ FT_BEGIN_HEADER
   /* <Description>                                                         */
   /*    This is another name of @FT_Get_MM_Blend_Coordinates.              */
   /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.7.1                                                              */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Get_Var_Blend_Coordinates( FT_Face    face,
                                 FT_UInt    num_coords,
                                 FT_Fixed*  coords );
 
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Enum>                                                                */
+  /*    FT_VAR_AXIS_FLAG_XXX                                               */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    A list of bit flags used in the return value of                    */
+  /*    @FT_Get_Var_Axis_Flags.                                            */
+  /*                                                                       */
+  /* <Values>                                                              */
+  /*    FT_VAR_AXIS_FLAG_HIDDEN ::                                         */
+  /*      The variation axis should not be exposed to user interfaces.     */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.8.1                                                              */
+  /*                                                                       */
+#define FT_VAR_AXIS_FLAG_HIDDEN  1
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Get_Var_Axis_Flags                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Get the `flags' field of an OpenType Variation Axis Record.        */
+  /*                                                                       */
+  /*    Not meaningful for Adobe MM fonts (`*flags' is always zero).       */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    master     :: The variation descriptor.                            */
+  /*                                                                       */
+  /*    axis_index :: The index of the requested variation axis.           */
+  /*                                                                       */
+  /* <Output>                                                              */
+  /*    flags      :: The `flags' field.  See @FT_VAR_AXIS_FLAG_XXX for    */
+  /*                  possible values.                                     */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.8.1                                                              */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Get_Var_Axis_Flags( FT_MM_Var*  master,
+                         FT_UInt     axis_index,
+                         FT_UInt*    flags );
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    FT_Set_Named_Instance                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set or change the current named instance.                          */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face           :: A handle to the source face.                     */
+  /*                                                                       */
+  /*    instance_index :: The index of the requested instance, starting    */
+  /*                      with value 1.  If set to value 0, FreeType       */
+  /*                      switches to font access without a named          */
+  /*                      instance.                                        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  /* <Note>                                                                */
+  /*    The function uses the value of `instance_index' to set bits 16-30  */
+  /*    of the face's `face_index' field.  It also resets any variation    */
+  /*    applied to the font, and the @FT_FACE_FLAG_VARIATION bit of the    */
+  /*    face's `face_flags' field gets reset to zero (i.e.,                */
+  /*    @FT_IS_VARIATION will return false).                               */
+  /*                                                                       */
+  /*    For Adobe MM fonts (which don't have named instances) this         */
+  /*    function simply resets the current face to the default instance.   */
+  /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.9                                                                */
+  /*                                                                       */
+  FT_EXPORT( FT_Error )
+  FT_Set_Named_Instance( FT_Face  face,
+                         FT_UInt  instance_index );
+
   /* */
 
 
index 4147aad..a6eb876 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType modules public interface (specification).                   */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -323,16 +323,15 @@ FT_BEGIN_HEADER
    *       The module name.
    *
    *    property_name ::
-   *       The property name.  Properties are described in the `Synopsis'
-   *       subsection of the module's documentation.
+   *       The property name.  Properties are described in section
+   *       @properties.
    *
    *       Note that only a few modules have properties.
    *
    *    value ::
    *       A generic pointer to a variable or structure that gives the new
    *       value of the property.  The exact definition of `value' is
-   *       dependent on the property; see the `Synopsis' subsection of the
-   *       module's documentation.
+   *       dependent on the property; see section @properties.
    *
    * @return:
    *   FreeType error code.  0~means success.
@@ -390,15 +389,14 @@ FT_BEGIN_HEADER
    *       The module name.
    *
    *    property_name ::
-   *       The property name.  Properties are described in the `Synopsis'
-   *       subsection of the module's documentation.
+   *       The property name.  Properties are described in section
+   *       @properties.
    *
    * @inout:
    *    value ::
    *       A generic pointer to a variable or structure that gives the
    *       value of the property.  The exact definition of `value' is
-   *       dependent on the property; see the `Synopsis' subsection of the
-   *       module's documentation.
+   *       dependent on the property; see section @properties.
    *
    * @return:
    *   FreeType error code.  0~means success.
@@ -446,8 +444,8 @@ FT_BEGIN_HEADER
   /* <Description>                                                         */
   /*    If compilation option FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES is   */
   /*    set, this function reads the `FREETYPE_PROPERTIES' environment     */
-  /*    variable to control driver properties.  See sections @auto_hinter, */
-  /*    @cff_driver, @pcf_driver, and @tt_driver for more.                 */
+  /*    variable to control driver properties.  See section @properties    */
+  /*    for more.                                                          */
   /*                                                                       */
   /*    If the compilation option is not set, this function does nothing.  */
   /*                                                                       */
@@ -475,6 +473,9 @@ FT_BEGIN_HEADER
   /* <InOut>                                                               */
   /*    library :: A handle to a new library object.                       */
   /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.8                                                                */
+  /*                                                                       */
   FT_EXPORT( void )
   FT_Set_Default_Properties( FT_Library  library );
 
index 7f60837..e0fc131 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType module error offsets (specification).                       */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index b5d27cf..26731c2 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for validating OpenType tables (specification).         */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 07f73eb..89389a4 100644 (file)
@@ -5,7 +5,7 @@
 /*    Support for the FT_Outline type used to store glyph shapes of        */
 /*    most scalable font formats (specification).                          */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -89,7 +89,7 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /* <Description>                                                         */
   /*    Walk over an outline's structure to decompose it into individual   */
-  /*    segments and Bézier arcs.  This function also emits `move to'      */
+  /*    segments and Bezier arcs.  This function also emits `move to'      */
   /*    operations to indicate the start of new contours in the outline.   */
   /*                                                                       */
   /* <Input>                                                               */
@@ -190,9 +190,6 @@ FT_BEGIN_HEADER
   /*    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 );
@@ -232,10 +229,10 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /* <Description>                                                         */
   /*    Return an outline's `control box'.  The control box encloses all   */
-  /*    the outline's points, including Bézier control points.  Though it  */
+  /*    the outline's points, including Bezier 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  */
-  /*    that contains Bézier outside arcs).                                */
+  /*    that contains Bezier 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  */
@@ -385,6 +382,9 @@ FT_BEGIN_HEADER
   /*    @FT_Outline_Embolden, which uses the same strength in both         */
   /*    directions.                                                        */
   /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.4.10                                                             */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Outline_EmboldenXY( FT_Outline*  outline,
                          FT_Pos       xstrength,
diff --git a/include/freetype/ftparams.h b/include/freetype/ftparams.h
new file mode 100644 (file)
index 0000000..5a9006c
--- /dev/null
@@ -0,0 +1,205 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftparams.h                                                             */
+/*                                                                         */
+/*    FreeType API for possible FT_Parameter tags (specification only).    */
+/*                                                                         */
+/*  Copyright 2017-2018 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.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 FTPARAMS_H_
+#define FTPARAMS_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:
+   *   parameter_tags
+   *
+   * @title:
+   *   Parameter Tags
+   *
+   * @abstract:
+   *   Macros for driver property and font loading parameter tags.
+   *
+   * @description:
+   *   This section contains macros for the @FT_Parameter structure that are
+   *   used with various functions to activate some special functionality or
+   *   different behaviour of various components of FreeType.
+   *
+   */
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY
+   *
+   * @description:
+   *   A tag for @FT_Parameter to make @FT_Open_Face ignore typographic
+   *   family names in the `name' table (introduced in OpenType version
+   *   1.4).  Use this for backward compatibility with legacy systems that
+   *   have a four-faces-per-family restriction.
+   *
+   * @since:
+   *   2.8
+   *
+   */
+#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY \
+          FT_MAKE_TAG( 'i', 'g', 'p', 'f' )
+
+
+  /* this constant is deprecated */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY \
+          FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY
+   *
+   * @description:
+   *   A tag for @FT_Parameter to make @FT_Open_Face ignore typographic
+   *   subfamily names in the `name' table (introduced in OpenType version
+   *   1.4).  Use this for backward compatibility with legacy systems that
+   *   have a four-faces-per-family restriction.
+   *
+   * @since:
+   *   2.8
+   *
+   */
+#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY \
+          FT_MAKE_TAG( 'i', 'g', 'p', 's' )
+
+
+  /* this constant is deprecated */
+#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY \
+          FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY
+
+
+  /***************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_INCREMENTAL
+   *
+   * @description:
+   *   An @FT_Parameter tag to be used with @FT_Open_Face to indicate
+   *   incremental glyph loading.
+   *
+   */
+#define FT_PARAM_TAG_INCREMENTAL \
+          FT_MAKE_TAG( 'i', 'n', 'c', 'r' )
+
+
+  /**************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_LCD_FILTER_WEIGHTS
+   *
+   * @description:
+   *   An @FT_Parameter tag to be used with @FT_Face_Properties.  The
+   *   corresponding argument specifies the five LCD filter weights for a
+   *   given face (if using @FT_LOAD_TARGET_LCD, for example), overriding
+   *   the global default values or the values set up with
+   *   @FT_Library_SetLcdFilterWeights.
+   *
+   * @since:
+   *   2.8
+   *
+   */
+#define FT_PARAM_TAG_LCD_FILTER_WEIGHTS \
+          FT_MAKE_TAG( 'l', 'c', 'd', 'f' )
+
+
+  /**************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_RANDOM_SEED
+   *
+   * @description:
+   *   An @FT_Parameter tag to be used with @FT_Face_Properties.  The
+   *   corresponding 32bit signed integer argument overrides the font
+   *   driver's random seed value with a face-specific one; see
+   *   @random-seed.
+   *
+   * @since:
+   *   2.8
+   *
+   */
+#define FT_PARAM_TAG_RANDOM_SEED \
+          FT_MAKE_TAG( 's', 'e', 'e', 'd' )
+
+
+  /**************************************************************************
+   *
+   * @constant:
+   *   FT_PARAM_TAG_STEM_DARKENING
+   *
+   * @description:
+   *   An @FT_Parameter tag to be used with @FT_Face_Properties.  The
+   *   corresponding Boolean argument specifies whether to apply stem
+   *   darkening, overriding the global default values or the values set up
+   *   with @FT_Property_Set (see @no-stem-darkening).
+   *
+   *   This is a passive setting that only takes effect if the font driver
+   *   or autohinter honors it, which the CFF, Type~1, and CID drivers
+   *   always do, but the autohinter only in `light' hinting mode (as of
+   *   version 2.9).
+   *
+   * @since:
+   *   2.8
+   *
+   */
+#define FT_PARAM_TAG_STEM_DARKENING \
+          FT_MAKE_TAG( 'd', 'a', 'r', 'k' )
+
+
+ /***************************************************************************
+  *
+  * @constant:
+  *   FT_PARAM_TAG_UNPATENTED_HINTING
+  *
+  * @description:
+  *   Deprecated, no effect.
+  *
+  *   Previously: 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 /* FTPARAMS_H_ */
+
+
+/* END */
diff --git a/include/freetype/ftpcfdrv.h b/include/freetype/ftpcfdrv.h
deleted file mode 100644 (file)
index 6622c93..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftpcfdrv.h                                                             */
-/*                                                                         */
-/*    FreeType API for controlling the PCF driver (specification only).    */
-/*                                                                         */
-/*  Copyright 2017 by                                                      */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.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 FTPCFDRV_H_
-#define FTPCFDRV_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:
-   *   pcf_driver
-   *
-   * @title:
-   *   The PCF driver
-   *
-   * @abstract:
-   *   Controlling the PCF driver module.
-   *
-   * @description:
-   *   While FreeType's PCF driver doesn't expose API functions by itself,
-   *   it is possible to control its behaviour with @FT_Property_Set and
-   *   @FT_Property_Get.  Right now, there is a single property
-   *   `no-long-family-names' available if FreeType is compiled with
-   *   PCF_CONFIG_OPTION_LONG_FAMILY_NAMES.
-   *
-   *   The PCF driver's module name is `pcf'.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   no-long-family-names
-   *
-   * @description:
-   *   If PCF_CONFIG_OPTION_LONG_FAMILY_NAMES is active while compiling
-   *   FreeType, the PCF driver constructs long family names.
-   *
-   *   There are many PCF fonts just called `Fixed' which look completely
-   *   different, and which have nothing to do with each other.  When
-   *   selecting `Fixed' in KDE or Gnome one gets results that appear rather
-   *   random, the style changes often if one changes the size and one
-   *   cannot select some fonts at all.  The improve this situation, the PCF
-   *   module prepends the foundry name (plus a space) to the family name. 
-   *   It also checks whether there are `wide' characters; all put together,
-   *   family names like `Sony Fixed' or `Misc Fixed Wide' are constructed.
-   *
-   *   If `no-long-family-names' is set, this feature gets switched off.
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_Bool     no_long_family_names = TRUE;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "pcf",
-   *                               "no-long-family-names",
-   *                               &no_long_family_names );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   This property can be set via the `FREETYPE_PROPERTIES' environment
-   *   variable (using values 1 and 0 for `on' and `off', respectively).
-   *
-   */
-
-
-FT_END_HEADER
-
-
-#endif /* FTPCFDRV_H_ */
-
-
-/* END */
index f2a6ae9..ce60eb4 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing PFR-specific data (specification only).   */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 9608375..fa8ad22 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType renderer modules public interface (specification).          */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -88,7 +88,7 @@ FT_BEGIN_HEADER
   typedef FT_Error
   (*FT_Renderer_RenderFunc)( FT_Renderer       renderer,
                              FT_GlyphSlot      slot,
-                             FT_UInt           mode,
+                             FT_Render_Mode    mode,
                              const FT_Vector*  origin );
 
   typedef FT_Error
index 2f3958a..72cb08b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType size objects management (specification).                    */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index a316540..8eb8d70 100644 (file)
@@ -7,7 +7,7 @@
 /*                                                                         */
 /*    This is _not_ used to retrieve glyph names!                          */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -25,6 +25,7 @@
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
+#include FT_PARAMETER_TAGS_H
 
 #ifdef FREETYPE_H
 #error "freetype.h of FreeType 1 has been loaded!"
@@ -189,6 +190,9 @@ FT_BEGIN_HEADER
   /*    Please refer to the TrueType or OpenType specification for more    */
   /*    details.                                                           */
   /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.8                                                                */
+  /*                                                                       */
   typedef struct  FT_SfntLangTag_
   {
     FT_Byte*  string;      /* this string is *not* null-terminated! */
@@ -229,53 +233,15 @@ FT_BEGIN_HEADER
   /*    invalid format~1 language ID values, FT_Err_Invalid_Argument is    */
   /*    returned.                                                          */
   /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.8                                                                */
+  /*                                                                       */
   FT_EXPORT( FT_Error )
   FT_Get_Sfnt_LangTag( FT_Face          face,
                        FT_UInt          langID,
                        FT_SfntLangTag  *alangTag );
 
 
-  /***************************************************************************
-   *
-   * @constant:
-   *   FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY
-   *
-   * @description:
-   *   A tag for @FT_Parameter to make @FT_Open_Face ignore typographic
-   *   family names in the `name' table (introduced in OpenType version
-   *   1.4).  Use this for backward compatibility with legacy systems that
-   *   have a four-faces-per-family restriction.
-   *
-   */
-#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY \
-          FT_MAKE_TAG( 'i', 'g', 'p', 'f' )
-
-
-  /* this constant is deprecated */
-#define FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY \
-          FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY
-
-
-  /***************************************************************************
-   *
-   * @constant:
-   *   FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY
-   *
-   * @description:
-   *   A tag for @FT_Parameter to make @FT_Open_Face ignore typographic
-   *   subfamily names in the `name' table (introduced in OpenType version
-   *   1.4).  Use this for backward compatibility with legacy systems that
-   *   have a four-faces-per-family restriction.
-   *
-   */
-#define FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY \
-          FT_MAKE_TAG( 'i', 'g', 'p', 's' )
-
-
-  /* this constant is deprecated */
-#define FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY \
-          FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY
-
   /* */
 
 
index 4a20667..44b6fbe 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType path stroker (specification).                               */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -466,7 +466,7 @@ FT_BEGIN_HEADER
    *   FT_Stroker_ConicTo
    *
    * @description:
-   *   `Draw' a single quadratic Bézier in the stroker's current sub-path,
+   *   `Draw' a single quadratic Bezier in the stroker's current sub-path,
    *   from the last position.
    *
    * @input:
@@ -474,7 +474,7 @@ FT_BEGIN_HEADER
    *     The target stroker handle.
    *
    *   control ::
-   *     A pointer to a Bézier control point.
+   *     A pointer to a Bezier control point.
    *
    *   to ::
    *     A pointer to the destination point.
@@ -498,7 +498,7 @@ FT_BEGIN_HEADER
    *   FT_Stroker_CubicTo
    *
    * @description:
-   *   `Draw' a single cubic Bézier in the stroker's current sub-path,
+   *   `Draw' a single cubic Bezier in the stroker's current sub-path,
    *   from the last position.
    *
    * @input:
@@ -506,10 +506,10 @@ FT_BEGIN_HEADER
    *     The target stroker handle.
    *
    *   control1 ::
-   *     A pointer to the first Bézier control point.
+   *     A pointer to the first Bezier control point.
    *
    *   control2 ::
-   *     A pointer to second Bézier control point.
+   *     A pointer to second Bezier control point.
    *
    *   to ::
    *     A pointer to the destination point.
index 1863fa2..ff9fb43 100644 (file)
@@ -5,7 +5,7 @@
 /*    FreeType synthesizing code for emboldening and slanting              */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 1aa4762..f6b1629 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType low-level system interface definition (specification).      */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 89f0350..2e3f3f1 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType trigonometric functions (specification).                    */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/include/freetype/ftttdrv.h b/include/freetype/ftttdrv.h
deleted file mode 100644 (file)
index 26bc5e9..0000000
+++ /dev/null
@@ -1,328 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftttdrv.h                                                              */
-/*                                                                         */
-/*    FreeType API for controlling the TrueType driver                     */
-/*    (specification only).                                                */
-/*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.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 FTTTDRV_H_
-#define FTTTDRV_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:
-   *   tt_driver
-   *
-   * @title:
-   *   The TrueType driver
-   *
-   * @abstract:
-   *   Controlling the TrueType driver module.
-   *
-   * @description:
-   *   While FreeType's TrueType driver doesn't expose API functions by
-   *   itself, it is possible to control its behaviour with @FT_Property_Set
-   *   and @FT_Property_Get.  The following lists the available properties
-   *   together with the necessary macros and structures.
-   *
-   *   The TrueType driver's module name is `truetype'.
-   *
-   *   We start with a list of definitions, kindly provided by Greg
-   *   Hitchcock.
-   *
-   *   _Bi-Level_ _Rendering_
-   *
-   *   Monochromatic rendering, exclusively used in the early days of
-   *   TrueType by both Apple and Microsoft.  Microsoft's GDI interface
-   *   supported hinting of the right-side bearing point, such that the
-   *   advance width could be non-linear.  Most often this was done to
-   *   achieve some level of glyph symmetry.  To enable reasonable
-   *   performance (e.g., not having to run hinting on all glyphs just to
-   *   get the widths) there was a bit in the head table indicating if the
-   *   side bearing was hinted, and additional tables, `hdmx' and `LTSH', to
-   *   cache hinting widths across multiple sizes and device aspect ratios.
-   *
-   *   _Font_ _Smoothing_
-   *
-   *   Microsoft's GDI implementation of anti-aliasing.  Not traditional
-   *   anti-aliasing as the outlines were hinted before the sampling.  The
-   *   widths matched the bi-level rendering.
-   *
-   *   _ClearType_ _Rendering_
-   *
-   *   Technique that uses physical subpixels to improve rendering on LCD
-   *   (and other) displays.  Because of the higher resolution, many methods
-   *   of improving symmetry in glyphs through hinting the right-side
-   *   bearing were no longer necessary.  This lead to what GDI calls
-   *   `natural widths' ClearType, see
-   *   http://www.beatstamm.com/typography/RTRCh4.htm#Sec21.  Since hinting
-   *   has extra resolution, most non-linearity went away, but it is still
-   *   possible for hints to change the advance widths in this mode.
-   *
-   *   _ClearType_ _Compatible_ _Widths_
-   *
-   *   One of the earliest challenges with ClearType was allowing the
-   *   implementation in GDI to be selected without requiring all UI and
-   *   documents to reflow.  To address this, a compatible method of
-   *   rendering ClearType was added where the font hints are executed once
-   *   to determine the width in bi-level rendering, and then re-run in
-   *   ClearType, with the difference in widths being absorbed in the font
-   *   hints for ClearType (mostly in the white space of hints); see
-   *   http://www.beatstamm.com/typography/RTRCh4.htm#Sec20.  Somewhat by
-   *   definition, compatible width ClearType allows for non-linear widths,
-   *   but only when the bi-level version has non-linear widths.
-   *
-   *   _ClearType_ _Subpixel_ _Positioning_
-   *
-   *   One of the nice benefits of ClearType is the ability to more crisply
-   *   display fractional widths; unfortunately, the GDI model of integer
-   *   bitmaps did not support this.  However, the WPF and Direct Write
-   *   frameworks do support fractional widths.  DWrite calls this `natural
-   *   mode', not to be confused with GDI's `natural widths'.  Subpixel
-   *   positioning, in the current implementation of Direct Write,
-   *   unfortunately does not support hinted advance widths, see
-   *   http://www.beatstamm.com/typography/RTRCh4.htm#Sec22.  Note that the
-   *   TrueType interpreter fully allows the advance width to be adjusted in
-   *   this mode, just the DWrite client will ignore those changes.
-   *
-   *   _ClearType_ _Backward_ _Compatibility_
-   *
-   *   This is a set of exceptions made in the TrueType interpreter to
-   *   minimize hinting techniques that were problematic with the extra
-   *   resolution of ClearType; see
-   *   http://www.beatstamm.com/typography/RTRCh4.htm#Sec1 and
-   *   http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx.
-   *   This technique is not to be confused with ClearType compatible
-   *   widths.  ClearType backward compatibility has no direct impact on
-   *   changing advance widths, but there might be an indirect impact on
-   *   disabling some deltas.  This could be worked around in backward
-   *   compatibility mode.
-   *
-   *   _Native_ _ClearType_ _Mode_
-   *
-   *   (Not to be confused with `natural widths'.)  This mode removes all
-   *   the exceptions in the TrueType interpreter when running with
-   *   ClearType.  Any issues on widths would still apply, though.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   interpreter-version
-   *
-   * @description:
-   *   Currently, three versions are available, two representing the
-   *   bytecode interpreter with subpixel hinting support (old `Infinality'
-   *   code and new stripped-down and higher performance `minimal' code) and
-   *   one without, respectively.  The default is subpixel support if
-   *   TT_CONFIG_OPTION_SUBPIXEL_HINTING is defined, and no subpixel support
-   *   otherwise (since it isn't available then).
-   *
-   *   If subpixel hinting is on, many TrueType bytecode instructions behave
-   *   differently compared to B/W or grayscale rendering (except if `native
-   *   ClearType' is selected by the font).  Microsoft's main idea is to
-   *   render at a much increased horizontal resolution, then sampling down
-   *   the created output to subpixel precision.  However, many older fonts
-   *   are not suited to this and must be specially taken care of by
-   *   applying (hardcoded) tweaks in Microsoft's interpreter.
-   *
-   *   Details on subpixel hinting and some of the necessary tweaks can be
-   *   found in Greg Hitchcock's whitepaper at
-   *   `http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx'. 
-   *   Note that FreeType currently doesn't really `subpixel hint' (6x1, 6x2,
-   *   or 6x5 supersampling) like discussed in the paper.  Depending on the
-   *   chosen interpreter, it simply ignores instructions on vertical stems
-   *   to arrive at very similar results.
-   *
-   *   The following example code demonstrates how to deactivate subpixel
-   *   hinting (omitting the error handling).
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_Face     face;
-   *     FT_UInt     interpreter_version = TT_INTERPRETER_VERSION_35;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "truetype",
-   *                               "interpreter-version",
-   *                               &interpreter_version );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   This property can be set via the `FREETYPE_PROPERTIES' environment
-   *   variable (using values `35', `38', or `40').
-   */
-
-
-  /**************************************************************************
-   *
-   * @enum:
-   *   TT_INTERPRETER_VERSION_XXX
-   *
-   * @description:
-   *   A list of constants used for the @interpreter-version property to
-   *   select the hinting engine for Truetype fonts.
-   *
-   *   The numeric value in the constant names represents the version
-   *   number as returned by the `GETINFO' bytecode instruction.
-   *
-   * @values:
-   *   TT_INTERPRETER_VERSION_35 ::
-   *     Version~35 corresponds to MS rasterizer v.1.7 as used e.g. in
-   *     Windows~98; only grayscale and B/W rasterizing is supported.
-   *
-   *   TT_INTERPRETER_VERSION_38 ::
-   *     Version~38 corresponds to MS rasterizer v.1.9; it is roughly
-   *     equivalent to the hinting provided by DirectWrite ClearType (as can
-   *     be found, for example, in the Internet Explorer~9 running on
-   *     Windows~7).  It is used in FreeType to select the `Infinality'
-   *     subpixel hinting code.  The code may be removed in a future
-   *     version.
-   *
-   *   TT_INTERPRETER_VERSION_40 ::
-   *     Version~40 corresponds to MS rasterizer v.2.1; it is roughly
-   *     equivalent to the hinting provided by DirectWrite ClearType (as can
-   *     be found, for example, in Microsoft's Edge Browser on Windows~10). 
-   *     It is used in FreeType to select the `minimal' subpixel hinting
-   *     code, a stripped-down and higher performance version of the
-   *     `Infinality' code.
-   *
-   * @note:
-   *   This property controls the behaviour of the bytecode interpreter
-   *   and thus how outlines get hinted.  It does *not* control how glyph
-   *   get rasterized!  In particular, it does not control subpixel color
-   *   filtering.
-   *
-   *   If FreeType has not been compiled with the configuration option
-   *   TT_CONFIG_OPTION_SUBPIXEL_HINTING, selecting version~38 or~40 causes
-   *   an `FT_Err_Unimplemented_Feature' error.
-   *
-   *   Depending on the graphics framework, Microsoft uses different
-   *   bytecode and rendering engines.  As a consequence, the version
-   *   numbers returned by a call to the `GETINFO' bytecode instruction are
-   *   more convoluted than desired.
-   *
-   *   Here are two tables that try to shed some light on the possible
-   *   values for the MS rasterizer engine, together with the additional
-   *   features introduced by it.
-   *
-   *   {
-   *     GETINFO framework               version feature
-   *     -------------------------------------------------------------------
-   *         3   GDI (Win 3.1),            v1.0  16-bit, first version
-   *             TrueImage
-   *        33   GDI (Win NT 3.1),         v1.5  32-bit
-   *             HP Laserjet
-   *        34   GDI (Win 95)              v1.6  font smoothing,
-   *                                             new SCANTYPE opcode
-   *        35   GDI (Win 98/2000)         v1.7  (UN)SCALED_COMPONENT_OFFSET
-   *                                               bits in composite glyphs
-   *        36   MGDI (Win CE 2)           v1.6+ classic ClearType
-   *        37   GDI (XP and later),       v1.8  ClearType
-   *             GDI+ old (before Vista)
-   *        38   GDI+ old (Vista, Win 7),  v1.9  subpixel ClearType,
-   *             WPF                             Y-direction ClearType,
-   *                                             additional error checking
-   *        39   DWrite (before Win 8)     v2.0  subpixel ClearType flags
-   *                                               in GETINFO opcode,
-   *                                             bug fixes
-   *        40   GDI+ (after Win 7),       v2.1  Y-direction ClearType flag
-   *             DWrite (Win 8)                    in GETINFO opcode,
-   *                                             Gray ClearType
-   *   }
-   *
-   *   The `version' field gives a rough orientation only, since some
-   *   applications provided certain features much earlier (as an example,
-   *   Microsoft Reader used subpixel and Y-direction ClearType already in
-   *   Windows 2000).  Similarly, updates to a given framework might include
-   *   improved hinting support.
-   *
-   *   {
-   *      version   sampling          rendering        comment
-   *               x        y       x           y
-   *     --------------------------------------------------------------
-   *       v1.0   normal  normal  B/W           B/W    bi-level
-   *       v1.6   high    high    gray          gray   grayscale
-   *       v1.8   high    normal  color-filter  B/W    (GDI) ClearType
-   *       v1.9   high    high    color-filter  gray   Color ClearType
-   *       v2.1   high    normal  gray          B/W    Gray ClearType
-   *       v2.1   high    high    gray          gray   Gray ClearType
-   *   }
-   *
-   *   Color and Gray ClearType are the two available variants of
-   *   `Y-direction ClearType', meaning grayscale rasterization along the
-   *   Y-direction; the name used in the TrueType specification for this
-   *   feature is `symmetric smoothing'.  `Classic ClearType' is the
-   *   original algorithm used before introducing a modified version in
-   *   Win~XP.  Another name for v1.6's grayscale rendering is `font
-   *   smoothing', and `Color ClearType' is sometimes also called `DWrite
-   *   ClearType'.  To differentiate between today's Color ClearType and the
-   *   earlier ClearType variant with B/W rendering along the vertical axis,
-   *   the latter is sometimes called `GDI ClearType'.
-   *
-   *   `Normal' and `high' sampling describe the (virtual) resolution to
-   *   access the rasterized outline after the hinting process.  `Normal'
-   *   means 1 sample per grid line (i.e., B/W).  In the current Microsoft
-   *   implementation, `high' means an extra virtual resolution of 16x16 (or
-   *   16x1) grid lines per pixel for bytecode instructions like `MIRP'.
-   *   After hinting, these 16 grid lines are mapped to 6x5 (or 6x1) grid
-   *   lines for color filtering if Color ClearType is activated.
-   *
-   *   Note that `Gray ClearType' is essentially the same as v1.6's
-   *   grayscale rendering.  However, the GETINFO instruction handles it
-   *   differently: v1.6 returns bit~12 (hinting for grayscale), while v2.1
-   *   returns bits~13 (hinting for ClearType), 18 (symmetrical smoothing),
-   *   and~19 (Gray ClearType).  Also, this mode respects bits 2 and~3 for
-   *   the version~1 gasp table exclusively (like Color ClearType), while
-   *   v1.6 only respects the values of version~0 (bits 0 and~1).
-   *
-   *   Keep in mind that the features of the above interpreter versions
-   *   might not map exactly to FreeType features or behavior because it is
-   *   a fundamentally different library with different internals.
-   *
-   */
-#define TT_INTERPRETER_VERSION_35  35
-#define TT_INTERPRETER_VERSION_38  38
-#define TT_INTERPRETER_VERSION_40  40
-
- /* */
-
-
-FT_END_HEADER
-
-
-#endif /* FTTTDRV_H_ */
-
-
-/* END */
index eab8ada..f638c2e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType simple types definitions (specification only).              */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -425,7 +425,7 @@ FT_BEGIN_HEADER
   /*    The address of the FreeType object that is under finalization.     */
   /*    Its client data is accessed through its `generic' field.           */
   /*                                                                       */
-  typedef void  (*FT_Generic_Finalizer)(void*  object);
+  typedef void  (*FT_Generic_Finalizer)( void*  object );
 
 
   /*************************************************************************/
index 1eeef6c..461c65b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing Windows fnt-specific data.                */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -78,7 +78,7 @@ FT_BEGIN_HEADER
    *     Mac Roman encoding.
    *
    *   FT_WinFNT_ID_OEM ::
-   *     From Michael Pöttgen <michael@poettgen.de>:
+   *     From Michael Poettgen <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',
index bae83e7..f4d308f 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level `autohint' module-specific interface (specification).     */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/include/freetype/internal/cffotypes.h b/include/freetype/internal/cffotypes.h
new file mode 100644 (file)
index 0000000..57e7591
--- /dev/null
@@ -0,0 +1,108 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffotypes.h                                                            */
+/*                                                                         */
+/*    Basic OpenType/CFF object type definitions (specification).          */
+/*                                                                         */
+/*  Copyright 2017-2018 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.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 CFFOTYPES_H_
+#define CFFOTYPES_H_
+
+#include <ft2build.h>
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_CFF_TYPES_H
+#include FT_INTERNAL_TRUETYPE_TYPES_H
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+
+
+FT_BEGIN_HEADER
+
+
+  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;
+
+
+FT_END_HEADER
+
+
+#endif /* CFFOTYPES_H_ */
+
+
+/* END */
similarity index 98%
rename from src/cff/cfftypes.h
rename to include/freetype/internal/cfftypes.h
index 74f569f..7c07e1a 100644 (file)
@@ -5,7 +5,7 @@
 /*    Basic OpenType/CFF type definitions and interface (specification     */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -27,6 +27,7 @@
 #include FT_INTERNAL_SERVICE_H
 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
 #include FT_INTERNAL_POSTSCRIPT_HINTS_H
+#include FT_INTERNAL_TYPE1_TYPES_H
 
 
 FT_BEGIN_HEADER
@@ -381,6 +382,9 @@ FT_BEGIN_HEADER
     /* interface to Postscript Names service */
     FT_Service_PsCMaps  psnames;
 
+    /* interface to CFFLoad service */
+    const void*  cffload;
+
     /* since version 2.3.0 */
     PS_FontInfoRec*  font_info;   /* font info dictionary */
 
@@ -394,6 +398,9 @@ FT_BEGIN_HEADER
     /* since version 2.7.1 */
     CFF_VStoreRec    vstore;        /* parsed vstore structure */
 
+    /* since version 2.9 */
+    PS_FontExtraRec*  font_extra;
+
   } CFF_FontRec;
 
 
index c9ac9d8..818a812 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Arithmetic computations (specification).                             */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -399,16 +399,42 @@ FT_BEGIN_HEADER
 #endif /* 0 */
 
 
-#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 INT_TO_F26DOT6( x )    ( (FT_Long)(x) * 64  )    /* << 6  */
+#define INT_TO_F2DOT14( x )    ( (FT_Long)(x) * 16384 )  /* << 14 */
+#define INT_TO_FIXED( x )      ( (FT_Long)(x) * 65536 )  /* << 16 */
+#define F2DOT14_TO_FIXED( x )  ( (FT_Long)(x) * 4 )      /* << 2  */
 #define FIXED_TO_INT( x )      ( FT_RoundFix( x ) >> 16 )
 
 #define ROUND_F26DOT6( x )     ( x >= 0 ? (    ( (x) + 32 ) & -64 )     \
                                         : ( -( ( 32 - (x) ) & -64 ) ) )
 
+  /*
+   *  The following macros have two purposes.
+   *
+   *  . Tag places where overflow is expected and harmless.
+   *
+   *  . Avoid run-time sanitizer errors.
+   *
+   *  Use with care!
+   */
+#define ADD_LONG( a, b )                             \
+          (FT_Long)( (FT_ULong)(a) + (FT_ULong)(b) )
+#define SUB_LONG( a, b )                             \
+          (FT_Long)( (FT_ULong)(a) - (FT_ULong)(b) )
+#define MUL_LONG( a, b )                             \
+          (FT_Long)( (FT_ULong)(a) * (FT_ULong)(b) )
+#define NEG_LONG( a )                                \
+          (FT_Long)( (FT_ULong)0 - (FT_ULong)(a) )
+
+#define ADD_INT32( a, b )                               \
+          (FT_Int32)( (FT_UInt32)(a) + (FT_UInt32)(b) )
+#define SUB_INT32( a, b )                               \
+          (FT_Int32)( (FT_UInt32)(a) - (FT_UInt32)(b) )
+#define MUL_INT32( a, b )                               \
+          (FT_Int32)( (FT_UInt32)(a) * (FT_UInt32)(b) )
+#define NEG_INT32( a )                                  \
+          (FT_Int32)( (FT_UInt32)0 - (FT_UInt32)(a) )
+
 
 FT_END_HEADER
 
index 5dcd2b1..292a4ee 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Debugging and logging component (specification).                     */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
similarity index 98%
rename from include/freetype/internal/ftdriver.h
rename to include/freetype/internal/ftdrv.h
index e82fa8d..58dd35a 100644 (file)
@@ -1,10 +1,10 @@
 /***************************************************************************/
 /*                                                                         */
-/*  ftdriver.h                                                             */
+/*  ftdrv.h                                                                */
 /*                                                                         */
-/*    FreeType font driver interface (specification).                      */
+/*    FreeType internal font driver interface (specification).             */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,8 +16,8 @@
 /***************************************************************************/
 
 
-#ifndef FTDRIVER_H_
-#define FTDRIVER_H_
+#ifndef FTDRV_H_
+#define FTDRV_H_
 
 
 #include <ft2build.h>
@@ -394,7 +394,7 @@ FT_BEGIN_HEADER
 
 FT_END_HEADER
 
-#endif /* FTDRIVER_H_ */
+#endif /* FTDRV_H_ */
 
 
 /* END */
index f41c3df..a002fdb 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType glyph loader (specification).                           */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 59e5b58..054eaec 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType memory management macros (specification).               */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -210,7 +210,7 @@ extern "C++"
                                                   NULL,                 \
                                                   &error ) )
 
-#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz           \
+#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz )           \
           FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,            \
                                                   (FT_Long)(itmsz),  \
                                                   (FT_Long)(oldcnt), \
index 5584091..37c6baf 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType private base classes (specification).                   */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -36,6 +36,7 @@
 #include FT_INTERNAL_AUTOHINT_H
 #include FT_INTERNAL_SERVICE_H
 #include FT_INTERNAL_PIC_H
+#include FT_INTERNAL_CALC_H
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
 #include FT_INCREMENTAL_H
@@ -84,14 +85,30 @@ FT_BEGIN_HEADER
                   : y + ( 3 * x >> 3 ) )
 
   /* we use FT_TYPEOF to suppress signedness compilation warnings */
-#define FT_PAD_FLOOR( x, n )  ( (x) & ~FT_TYPEOF( 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_PAD_FLOOR( x, n )  ( (x) & ~FT_TYPEOF( 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) & ~FT_TYPEOF( x )63 )
 #define FT_PIX_ROUND( x )     FT_PIX_FLOOR( (x) + 32 )
 #define FT_PIX_CEIL( x )      FT_PIX_FLOOR( (x) + 63 )
 
+  /* specialized versions (for signed values)                   */
+  /* that don't produce run-time errors due to integer overflow */
+#define FT_PAD_ROUND_LONG( x, n )  FT_PAD_FLOOR( ADD_LONG( (x), (n) / 2 ), \
+                                                 n )
+#define FT_PAD_CEIL_LONG( x, n )   FT_PAD_FLOOR( ADD_LONG( (x), (n) - 1 ), \
+                                                 n )
+#define FT_PIX_ROUND_LONG( x )     FT_PIX_FLOOR( ADD_LONG( (x), 32 ) )
+#define FT_PIX_CEIL_LONG( x )      FT_PIX_FLOOR( ADD_LONG( (x), 63 ) )
+
+#define FT_PAD_ROUND_INT32( x, n )  FT_PAD_FLOOR( ADD_INT32( (x), (n) / 2 ), \
+                                                  n )
+#define FT_PAD_CEIL_INT32( x, n )   FT_PAD_FLOOR( ADD_INT32( (x), (n) - 1 ), \
+                                                  n )
+#define FT_PIX_ROUND_INT32( x )     FT_PIX_FLOOR( ADD_INT32( (x), 32 ) )
+#define FT_PIX_CEIL_INT32( x )      FT_PIX_FLOOR( ADD_INT32( (x), 63 ) )
+
 
   /*
    *  character classification functions -- since these are used to parse
@@ -139,7 +156,7 @@ FT_BEGIN_HEADER
   } FT_CMapRec;
 
   /* typecase any pointer to a charmap handle */
-#define FT_CMAP( x )              ((FT_CMap)( x ))
+#define FT_CMAP( x )  ( (FT_CMap)( x ) )
 
   /* obvious macros */
 #define FT_CMAP_PLATFORM_ID( x )  FT_CMAP( x )->charmap.platform_id
@@ -295,6 +312,27 @@ FT_BEGIN_HEADER
   FT_CMap_Done( FT_CMap  cmap );
 
 
+  /* adds LCD padding to Min and Max boundaries */
+  FT_BASE( void )
+  ft_lcd_padding( FT_Pos*       Min,
+                  FT_Pos*       Max,
+                  FT_GlyphSlot  slot );
+
+#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
+
+  typedef void  (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap*      bitmap,
+                                            FT_Render_Mode  render_mode,
+                                            FT_Byte*        weights );
+
+
+  /* This is the default LCD filter, an in-place, 5-tap FIR filter. */
+  FT_BASE( void )
+  ft_lcd_filter_fir( FT_Bitmap*           bitmap,
+                     FT_Render_Mode       mode,
+                     FT_LcdFiveTapFilter  weights );
+
+#endif /* FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+
   /*************************************************************************/
   /*                                                                       */
   /* <Struct>                                                              */
@@ -352,9 +390,10 @@ FT_BEGIN_HEADER
   /*      operator.  Value~0 means to use the font's value.  Value~-1      */
   /*      means to use the CFF driver's default.                           */
   /*                                                                       */
-  /*    lcd_weights ::                                                     */
-  /*      Overrides the library default with custom weights for the 5-tap  */
-  /*      FIR filter.  `{0, 0, 0, 0, 0}' means to use the library default. */
+  /*    lcd_weights      ::                                                */
+  /*    lcd_filter_func  ::                                                */
+  /*      If subpixel rendering is activated, the LCD filtering weights    */
+  /*      and callback function.                                           */
   /*                                                                       */
   /*    refcount ::                                                        */
   /*      A counter initialized to~1 at the time an @FT_Face structure is  */
@@ -376,8 +415,10 @@ FT_BEGIN_HEADER
 
     FT_Char              no_stem_darkening;
     FT_Int32             random_seed;
+
 #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-    FT_LcdFiveTapFilter  lcd_weights;  /* preset or custom filter weights */
+    FT_LcdFiveTapFilter      lcd_weights;      /* filter weights, if any */
+    FT_Bitmap_LcdFilterFunc  lcd_filter_func;  /* filtering callback     */
 #endif
 
     FT_Int  refcount;
@@ -499,7 +540,8 @@ FT_BEGIN_HEADER
 
 
   /* typecast an object to an FT_Module */
-#define FT_MODULE( x )          ((FT_Module)( x ))
+#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
@@ -585,9 +627,9 @@ FT_BEGIN_HEADER
 
   /* 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( 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
@@ -688,6 +730,12 @@ FT_BEGIN_HEADER
   ft_glyphslot_free_bitmap( FT_GlyphSlot  slot );
 
 
+  /* Preset bitmap metrics of an outline glyphslot prior to rendering. */
+  FT_BASE( void )
+  ft_glyphslot_preset_bitmap( FT_GlyphSlot      slot,
+                              FT_Render_Mode    mode,
+                              const FT_Vector*  origin );
+
   /* Allocate a new bitmap buffer in a glyph slot. */
   FT_BASE( FT_Error )
   ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,
@@ -714,10 +762,10 @@ FT_BEGIN_HEADER
   /*************************************************************************/
 
 
-#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 ))
+#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_
@@ -748,7 +796,7 @@ FT_BEGIN_HEADER
 
 
   /* typecast a module into a driver easily */
-#define FT_DRIVER( x )        ((FT_Driver)(x))
+#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
@@ -804,18 +852,6 @@ FT_BEGIN_HEADER
 #define FT_DEBUG_HOOK_TRUETYPE  0
 
 
-  typedef void  (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap*      bitmap,
-                                            FT_Render_Mode  render_mode,
-                                            FT_Byte*        weights );
-
-
-  /* This is the default LCD filter, an in-place, 5-tap FIR filter. */
-  FT_BASE( void )
-  ft_lcd_filter_fir( FT_Bitmap*           bitmap,
-                     FT_Render_Mode       mode,
-                     FT_LcdFiveTapFilter  weights );
-
-
   /*************************************************************************/
   /*                                                                       */
   /* <Struct>                                                              */
@@ -856,22 +892,11 @@ FT_BEGIN_HEADER
   /*                                                                       */
   /*    auto_hinter      :: The auto-hinter module interface.              */
   /*                                                                       */
-  /*    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      :: An array of four function pointers that allow  */
   /*                        debuggers to hook into a font format's         */
   /*                        interpreter.  Currently, only the TrueType     */
   /*                        bytecode debugger uses this.                   */
   /*                                                                       */
-  /*    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.                        */
   /*                                                                       */
@@ -903,15 +928,9 @@ FT_BEGIN_HEADER
     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_LcdFiveTapFilter      lcd_weights;      /* filter weights, if any */
     FT_Bitmap_LcdFilterFunc  lcd_filter_func;  /* filtering callback     */
 #endif
index 0d43ed2..5214f05 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services (declaration).       */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/include/freetype/internal/ftpsprop.h b/include/freetype/internal/ftpsprop.h
new file mode 100644 (file)
index 0000000..abbb628
--- /dev/null
@@ -0,0 +1,48 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpsprop.h                                                             */
+/*                                                                         */
+/*    Get and set properties of PostScript drivers (specification).        */
+/*                                                                         */
+/*  Copyright 2017-2018 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.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 FTPSPROP_H_
+#define FTPSPROP_H_
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+
+FT_BEGIN_HEADER
+
+
+  FT_BASE_CALLBACK( FT_Error )
+  ps_property_set( FT_Module    module,         /* PS_Driver */
+                   const char*  property_name,
+                   const void*  value,
+                   FT_Bool      value_is_string );
+
+  FT_BASE_CALLBACK( FT_Error )
+  ps_property_get( FT_Module    module,         /* PS_Driver */
+                   const char*  property_name,
+                   void*        value );
+
+
+FT_END_HEADER
+
+
+#endif /* FTPSPROP_H_ */
+
+
+/* END */
index 25a44a4..1aca48a 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Embedded resource forks accessor (specification).                    */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  Masatake YAMATO and Redhat K.K.                                        */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 71ef9ca..e01c167 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType services (specification only).                          */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -330,6 +330,32 @@ FT_BEGIN_HEADER
     { NULL, NULL }                                                          \
   };
 
+#define FT_DEFINE_SERVICEDESCREC10( 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,                 \
+                                    serv_id_7, serv_data_7,                 \
+                                    serv_id_8, serv_data_8,                 \
+                                    serv_id_9, serv_data_9,                 \
+                                    serv_id_10, serv_data_10 )              \
+  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 },                                             \
+    { serv_id_7, serv_data_7 },                                             \
+    { serv_id_8, serv_data_8 },                                             \
+    { serv_id_9, serv_data_9 },                                             \
+    { serv_id_10, serv_data_10 },                                           \
+    { NULL, NULL }                                                          \
+  };
+
 #else /* FT_CONFIG_OPTION_PIC */
 
 #define FT_DEFINE_SERVICEDESCREC1( class_,                                  \
@@ -557,7 +583,7 @@ FT_BEGIN_HEADER
                                                                             \
   FT_Error                                                                  \
   FT_Create_Class_ ## class_( FT_Library           library,                 \
-                              FT_ServiceDescRec**  output_class           \
+                              FT_ServiceDescRec**  output_class )           \
   {                                                                         \
     FT_ServiceDescRec*  clazz  = NULL;                                      \
     FT_Error            error;                                              \
@@ -608,7 +634,7 @@ FT_BEGIN_HEADER
                                                                             \
   FT_Error                                                                  \
   FT_Create_Class_ ## class_( FT_Library           library,                 \
-                              FT_ServiceDescRec**  output_class           \
+                              FT_ServiceDescRec**  output_class )           \
   {                                                                         \
     FT_ServiceDescRec*  clazz  = NULL;                                      \
     FT_Error            error;                                              \
@@ -662,7 +688,7 @@ FT_BEGIN_HEADER
                                                                             \
   FT_Error                                                                  \
   FT_Create_Class_ ## class_( FT_Library           library,                 \
-                              FT_ServiceDescRec**  output_class           \
+                              FT_ServiceDescRec**  output_class )           \
   {                                                                         \
     FT_ServiceDescRec*  clazz  = NULL;                                      \
     FT_Error            error;                                              \
@@ -719,7 +745,7 @@ FT_BEGIN_HEADER
                                                                             \
   FT_Error                                                                  \
   FT_Create_Class_ ## class_( FT_Library           library,                 \
-                              FT_ServiceDescRec**  output_class           \
+                              FT_ServiceDescRec**  output_class )           \
   {                                                                         \
     FT_ServiceDescRec*  clazz  = NULL;                                      \
     FT_Error            error;                                              \
@@ -755,6 +781,68 @@ FT_BEGIN_HEADER
     return FT_Err_Ok;                                                       \
   }
 
+#define FT_DEFINE_SERVICEDESCREC10( 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,                 \
+                                    serv_id_7, serv_data_7,                 \
+                                    serv_id_8, serv_data_8,                 \
+                                    serv_id_9, serv_data_9,                 \
+                                    serv_id_10, serv_data_10 )              \
+  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  = NULL;                                      \
+    FT_Error            error;                                              \
+    FT_Memory           memory = library->memory;                           \
+                                                                            \
+                                                                            \
+    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 11 ) )                        \
+      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   = serv_id_7;                                        \
+    clazz[ 6].serv_data = serv_data_7;                                      \
+    clazz[ 7].serv_id   = serv_id_8;                                        \
+    clazz[ 7].serv_data = serv_data_8;                                      \
+    clazz[ 8].serv_id   = serv_id_9;                                        \
+    clazz[ 8].serv_data = serv_data_9;                                      \
+    clazz[ 9].serv_id   = serv_id_10;                                       \
+    clazz[ 9].serv_data = serv_data_10;                                     \
+    clazz[10].serv_id   = NULL;                                             \
+    clazz[10].serv_data = NULL;                                             \
+                                                                            \
+    *output_class = clazz;                                                  \
+                                                                            \
+    return FT_Err_Ok;                                                       \
+  }
+
 #endif /* FT_CONFIG_OPTION_PIC */
 
 
@@ -898,7 +986,9 @@ FT_BEGIN_HEADER
    */
 
 #define FT_SERVICE_BDF_H                <freetype/internal/services/svbdf.h>
+#define FT_SERVICE_CFF_TABLE_LOAD_H     <freetype/internal/services/svcfftl.h>
 #define FT_SERVICE_CID_H                <freetype/internal/services/svcid.h>
+#define FT_SERVICE_FONT_FORMAT_H        <freetype/internal/services/svfntfmt.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>
@@ -912,10 +1002,9 @@ FT_BEGIN_HEADER
 #define FT_SERVICE_PROPERTIES_H         <freetype/internal/services/svprop.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_TRUETYPE_GLYF_H      <freetype/internal/services/svttglyf.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_FONT_FORMAT_H        <freetype/internal/services/svfntfmt.h>
-#define FT_SERVICE_TRUETYPE_GLYF_H      <freetype/internal/services/svttglyf.h>
 
  /* */
 
index 3e2c07b..f90002f 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Stream handling (specification).                                     */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -165,8 +165,8 @@ FT_BEGIN_HEADER
 #define FT_BYTE_U32( p, i, s )  ( FT_UINT32( FT_BYTE_( p, i ) ) << (s) )
 
 
-#define FT_PEEK_SHORT( p )  FT_INT16( FT_BYTE_U16( p, 0, 8) | \
-                                      FT_BYTE_U16( p, 1, 0) )
+#define FT_PEEK_SHORT( p )  FT_INT16( FT_BYTE_U16( p, 0, 8 ) | \
+                                      FT_BYTE_U16( p, 1, 0 ) )
 
 #define FT_PEEK_USHORT( p )  FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \
                                         FT_BYTE_U16( p, 1, 0 ) )
index caf5fc9..8092e41 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Tracing handling (specification only).                               */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -39,6 +39,7 @@ 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)  */
 FT_TRACE_DEF( bitmap )    /* bitmap checksum         (ftobjs.c)   */
+FT_TRACE_DEF( psprops )   /* PS driver properties    (ftpsprop.c) */
 
   /* Cache sub-system */
 FT_TRACE_DEF( cache )     /* cache sub-system        (ftcache.c, etc.) */
@@ -66,20 +67,19 @@ FT_TRACE_DEF( ttgxvar )   /* TrueType GX var handler (ttgxvar.c)  */
 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( cffdecode )
 FT_TRACE_DEF( psobjs )
 FT_TRACE_DEF( psconv )
 
   /* PostScript hinting module `pshinter' */
 FT_TRACE_DEF( pshrec )
-FT_TRACE_DEF( pshalgo1 )
-FT_TRACE_DEF( pshalgo2 )
+FT_TRACE_DEF( pshalgo )
 
   /* Type 2 driver components */
 FT_TRACE_DEF( cffdriver )
@@ -96,7 +96,6 @@ FT_TRACE_DEF( cf2interp )
 FT_TRACE_DEF( t42 )
 
   /* CID driver components */
-FT_TRACE_DEF( cidafm )
 FT_TRACE_DEF( ciddriver )
 FT_TRACE_DEF( cidgload )
 FT_TRACE_DEF( cidload )
index df6f7c5..cad47a5 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType validation support (specification).                         */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 0204681..8f546e4 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Internal header files (specification only).                          */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -31,7 +31,7 @@
 #define FT_INTERNAL_DEBUG_H               <freetype/internal/ftdebug.h>
 #define FT_INTERNAL_CALC_H                <freetype/internal/ftcalc.h>
 #define FT_INTERNAL_HASH_H                <freetype/internal/fthash.h>
-#define FT_INTERNAL_DRIVER_H              <freetype/internal/ftdriver.h>
+#define FT_INTERNAL_DRIVER_H              <freetype/internal/ftdrv.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_POSTSCRIPT_AUX_H      <freetype/internal/psaux.h>
 #define FT_INTERNAL_POSTSCRIPT_HINTS_H    <freetype/internal/pshints.h>
+#define FT_INTERNAL_POSTSCRIPT_PROPS_H    <freetype/internal/ftpsprop.h>
 
 #define FT_INTERNAL_AUTOHINT_H            <freetype/internal/autohint.h>
 
+#define FT_INTERNAL_CFF_TYPES_H           <freetype/internal/cfftypes.h>
+#define FT_INTERNAL_CFF_OBJECTS_TYPES_H   <freetype/internal/cffotypes.h>
+
 
 #if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */
 
index 935eb1a..f77380d 100644 (file)
@@ -5,7 +5,7 @@
 /*    Auxiliary functions and data structures related to PostScript fonts  */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 #include FT_INTERNAL_OBJECTS_H
 #include FT_INTERNAL_TYPE1_TYPES_H
 #include FT_INTERNAL_HASH_H
+#include FT_INTERNAL_TRUETYPE_TYPES_H
 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
+#include FT_INTERNAL_CFF_TYPES_H
+#include FT_INTERNAL_CFF_OBJECTS_TYPES_H
+
 
 
 FT_BEGIN_HEADER
 
 
+  /***********************************************************************/
+  /*                                                                     */
+  /* PostScript modules driver class.                                    */
+  /*                                                                     */
+  typedef struct  PS_DriverRec_
+  {
+    FT_DriverRec  root;
+
+    FT_UInt   hinting_engine;
+    FT_Bool   no_stem_darkening;
+    FT_Int    darken_params[8];
+    FT_Int32  random_seed;
+
+  } PS_DriverRec, *PS_Driver;
+
+
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
@@ -442,6 +462,202 @@ FT_BEGIN_HEADER
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
+  /*****                         PS BUILDER                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct PS_Builder_  PS_Builder;
+  typedef const struct PS_Builder_FuncsRec_*  PS_Builder_Funcs;
+
+  typedef struct  PS_Builder_FuncsRec_
+  {
+    void
+    (*init)( PS_Builder*  ps_builder,
+             void*        builder,
+             FT_Bool      is_t1 );
+
+    void
+    (*done)( PS_Builder*  builder );
+
+  } PS_Builder_FuncsRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Structure>                                                           */
+  /*    PS_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       :: XXX                                                */
+  /*                                                                       */
+  /*    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.                                            */
+  /*                                                                       */
+  /*    is_t1        :: Set if current font type is Type 1.                */
+  /*                                                                       */
+  /*    funcs        :: An array of function pointers for the builder.     */
+  /*                                                                       */
+  struct  PS_Builder_
+  {
+    FT_Memory       memory;
+    FT_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;
+    FT_Bool  is_t1;
+
+    PS_Builder_FuncsRec  funcs;
+
+  };
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            PS DECODER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+#define PS_MAX_OPERANDS        48
+#define PS_MAX_SUBRS_CALLS     16   /* maximum subroutine nesting;         */
+                                    /* only 10 are allowed but there exist */
+                                    /* fonts like `HiraKakuProN-W3.ttf'    */
+                                    /* (Hiragino Kaku Gothic ProN W3;      */
+                                    /* 8.2d6e1; 2014-12-19) that exceed    */
+                                    /* this limit                          */
+
+  /* execution context charstring zone */
+
+  typedef struct  PS_Decoder_Zone_
+  {
+    FT_Byte*  base;
+    FT_Byte*  limit;
+    FT_Byte*  cursor;
+
+  } PS_Decoder_Zone;
+
+
+  typedef FT_Error
+  (*CFF_Decoder_Get_Glyph_Callback)( TT_Face    face,
+                                     FT_UInt    glyph_index,
+                                     FT_Byte**  pointer,
+                                     FT_ULong*  length );
+
+  typedef void
+  (*CFF_Decoder_Free_Glyph_Callback)( TT_Face    face,
+                                      FT_Byte**  pointer,
+                                      FT_ULong   length );
+
+
+  typedef struct  PS_Decoder_
+  {
+    PS_Builder  builder;
+
+    FT_Fixed   stack[PS_MAX_OPERANDS + 1];
+    FT_Fixed*  top;
+
+    PS_Decoder_Zone   zones[PS_MAX_SUBRS_CALLS + 1];
+    PS_Decoder_Zone*  zone;
+
+    FT_Int     flex_state;
+    FT_Int     num_flex_vectors;
+    FT_Vector  flex_vectors[7];
+
+    CFF_Font     cff;
+    CFF_SubFont  current_subfont; /* for current glyph_index */
+    FT_Generic*  cf2_instance;
+
+    FT_Pos*  glyph_width;
+    FT_Bool  width_only;
+    FT_Int   num_hints;
+
+    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_Get_Glyph_Callback   get_glyph_callback;
+    CFF_Decoder_Free_Glyph_Callback  free_glyph_callback;
+
+    /* Type 1 stuff */
+    FT_Service_PsCMaps  psnames;      /* for seac */
+
+    FT_Int    lenIV;         /* internal for sub routine calls   */
+    FT_UInt*  locals_len;    /* array of subrs length (optional) */
+    FT_Hash   locals_hash;   /* used if `num_subrs' was massaged */
+
+    FT_Matrix  font_matrix;
+    FT_Vector  font_offset;
+
+    PS_Blend  blend;         /* for multiple master support */
+
+    FT_Long*  buildchar;
+    FT_UInt   len_buildchar;
+
+  } PS_Decoder;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
   /*****                         T1 BUILDER                            *****/
   /*****                                                               *****/
   /*************************************************************************/
@@ -653,10 +869,23 @@ FT_BEGIN_HEADER
     void
     (*done)( T1_Decoder  decoder );
 
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+    FT_Error
+    (*parse_charstrings_old)( T1_Decoder  decoder,
+                              FT_Byte*    base,
+                              FT_UInt     len );
+#else
+    FT_Error
+    (*parse_metrics)( T1_Decoder  decoder,
+                      FT_Byte*    base,
+                      FT_UInt     len );
+#endif
+
     FT_Error
-    (*parse_charstrings)( T1_Decoder  decoder,
-                          FT_Byte*    base,
-                          FT_UInt     len );
+    (*parse_charstrings)( PS_Decoder*  decoder,
+                          FT_Byte*     charstring_base,
+                          FT_ULong     charstring_len );
+
 
   } T1_Decoder_FuncsRec;
 
@@ -700,12 +929,261 @@ FT_BEGIN_HEADER
 
     FT_Bool              seac;
 
+    FT_Generic           cf2_instance;
+
   } T1_DecoderRec;
 
 
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
+  /*****                        CFF BUILDER                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  typedef struct CFF_Builder_  CFF_Builder;
+
+
+  typedef FT_Error
+  (*CFF_Builder_Check_Points_Func)( CFF_Builder*  builder,
+                                    FT_Int        count );
+
+  typedef void
+  (*CFF_Builder_Add_Point_Func)( CFF_Builder*  builder,
+                                 FT_Pos        x,
+                                 FT_Pos        y,
+                                 FT_Byte       flag );
+  typedef FT_Error
+  (*CFF_Builder_Add_Point1_Func)( CFF_Builder*  builder,
+                                  FT_Pos        x,
+                                  FT_Pos        y );
+  typedef FT_Error
+  (*CFF_Builder_Start_Point_Func)( CFF_Builder*  builder,
+                                   FT_Pos        x,
+                                   FT_Pos        y );
+  typedef void
+  (*CFF_Builder_Close_Contour_Func)( CFF_Builder*  builder );
+
+  typedef FT_Error
+  (*CFF_Builder_Add_Contour_Func)( CFF_Builder*  builder );
+
+  typedef const struct CFF_Builder_FuncsRec_*  CFF_Builder_Funcs;
+
+  typedef struct  CFF_Builder_FuncsRec_
+  {
+    void
+    (*init)( CFF_Builder*   builder,
+             TT_Face        face,
+             CFF_Size       size,
+             CFF_GlyphSlot  glyph,
+             FT_Bool        hinting );
+
+    void
+    (*done)( CFF_Builder*  builder );
+
+    CFF_Builder_Check_Points_Func   check_points;
+    CFF_Builder_Add_Point_Func      add_point;
+    CFF_Builder_Add_Point1_Func     add_point1;
+    CFF_Builder_Add_Contour_Func    add_contour;
+    CFF_Builder_Start_Point_Func    start_point;
+    CFF_Builder_Close_Contour_Func  close_contour;
+
+  } CFF_Builder_FuncsRec;
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <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.                    */
+  /*                                                                       */
+  /*    funcs         :: A table of method pointers for this object.       */
+  /*                                                                       */
+  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_FuncsRec  funcs;
+  };
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                        CFF DECODER                            *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+#define CFF_MAX_OPERANDS        48
+#define CFF_MAX_SUBRS_CALLS     16  /* maximum subroutine nesting;         */
+                                    /* only 10 are allowed but there exist */
+                                    /* fonts like `HiraKakuProN-W3.ttf'    */
+                                    /* (Hiragino Kaku Gothic ProN W3;      */
+                                    /* 8.2d6e1; 2014-12-19) that exceed    */
+                                    /* this limit                          */
+#define CFF_MAX_TRANS_ELEMENTS  32
+
+  /* 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_SubFont  current_subfont; /* for current glyph_index */
+
+    CFF_Decoder_Get_Glyph_Callback   get_glyph_callback;
+    CFF_Decoder_Free_Glyph_Callback  free_glyph_callback;
+
+  } CFF_Decoder;
+
+
+  typedef const struct CFF_Decoder_FuncsRec_*  CFF_Decoder_Funcs;
+
+  typedef struct  CFF_Decoder_FuncsRec_
+  {
+    void
+    (*init)( CFF_Decoder*                     decoder,
+             TT_Face                          face,
+             CFF_Size                         size,
+             CFF_GlyphSlot                    slot,
+             FT_Bool                          hinting,
+             FT_Render_Mode                   hint_mode,
+             CFF_Decoder_Get_Glyph_Callback   get_callback,
+             CFF_Decoder_Free_Glyph_Callback  free_callback );
+
+    FT_Error
+    (*prepare)( CFF_Decoder*  decoder,
+                CFF_Size      size,
+                FT_UInt       glyph_index );
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+    FT_Error
+    (*parse_charstrings_old)( CFF_Decoder*  decoder,
+                              FT_Byte*      charstring_base,
+                              FT_ULong      charstring_len,
+                              FT_Bool       in_dict );
+#endif
+
+    FT_Error
+    (*parse_charstrings)( PS_Decoder*  decoder,
+                          FT_Byte*     charstring_base,
+                          FT_ULong     charstring_len );
+
+  } CFF_Decoder_FuncsRec;
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
   /*****                            AFM PARSER                         *****/
   /*****                                                               *****/
   /*************************************************************************/
@@ -810,11 +1288,26 @@ FT_BEGIN_HEADER
                    FT_Offset  length,
                    FT_UShort  seed );
 
+    FT_UInt32
+    (*cff_random)( FT_UInt32  r );
+
+    void
+    (*ps_decoder_init)( PS_Decoder*  ps_decoder,
+                        void*        decoder,
+                        FT_Bool      is_t1 );
+
+    void
+    (*t1_make_subfont)( FT_Face      face,
+                        PS_Private   priv,
+                        CFF_SubFont  subfont );
+
     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;
 
+    const CFF_Decoder_FuncsRec*  cff_decoder_funcs;
+
   } PSAux_ServiceRec, *PSAux_Service;
 
   /* backward compatible type definition */
index 49116eb..d29314e 100644 (file)
@@ -6,7 +6,7 @@
 /*    recorders (specification only).  These are used to support native    */
 /*    T1/T2 hints in the `type1', `cid', and `cff' font drivers.           */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index eeebf67..4a9ec20 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType BDF services (specification).                           */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/include/freetype/internal/services/svcfftl.h b/include/freetype/internal/services/svcfftl.h
new file mode 100644 (file)
index 0000000..db623e6
--- /dev/null
@@ -0,0 +1,112 @@
+/***************************************************************************/
+/*                                                                         */
+/*  svcfftl.h                                                              */
+/*                                                                         */
+/*    The FreeType CFF tables loader service (specification).              */
+/*                                                                         */
+/*  Copyright 2017-2018 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.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 SVCFFTL_H_
+#define SVCFFTL_H_
+
+#include FT_INTERNAL_SERVICE_H
+#include FT_INTERNAL_CFF_TYPES_H
+
+
+FT_BEGIN_HEADER
+
+
+#define FT_SERVICE_ID_CFF_LOAD  "cff-load"
+
+
+  typedef FT_UShort
+  (*FT_Get_Standard_Encoding_Func)( FT_UInt  charcode );
+
+  typedef FT_Error
+  (*FT_Load_Private_Dict_Func)( CFF_Font     font,
+                                CFF_SubFont  subfont,
+                                FT_UInt      lenNDV,
+                                FT_Fixed*    NDV );
+
+  typedef FT_Byte
+  (*FT_FD_Select_Get_Func)( CFF_FDSelect  fdselect,
+                            FT_UInt       glyph_index );
+
+  typedef FT_Bool
+  (*FT_Blend_Check_Vector_Func)( CFF_Blend  blend,
+                                 FT_UInt    vsindex,
+                                 FT_UInt    lenNDV,
+                                 FT_Fixed*  NDV );
+
+  typedef FT_Error
+  (*FT_Blend_Build_Vector_Func)( CFF_Blend  blend,
+                                 FT_UInt    vsindex,
+                                 FT_UInt    lenNDV,
+                                 FT_Fixed*  NDV );
+
+
+  FT_DEFINE_SERVICE( CFFLoad )
+  {
+    FT_Get_Standard_Encoding_Func  get_standard_encoding;
+    FT_Load_Private_Dict_Func      load_private_dict;
+    FT_FD_Select_Get_Func          fd_select_get;
+    FT_Blend_Check_Vector_Func     blend_check_vector;
+    FT_Blend_Build_Vector_Func     blend_build_vector;
+  };
+
+
+#ifndef FT_CONFIG_OPTION_PIC
+
+#define FT_DEFINE_SERVICE_CFFLOADREC( class_,                  \
+                                      get_standard_encoding_,  \
+                                      load_private_dict_,      \
+                                      fd_select_get_,          \
+                                      blend_check_vector_,     \
+                                      blend_build_vector_ )    \
+  static const FT_Service_CFFLoadRec  class_ =                 \
+  {                                                            \
+    get_standard_encoding_,                                    \
+    load_private_dict_,                                        \
+    fd_select_get_,                                            \
+    blend_check_vector_,                                       \
+    blend_build_vector_                                        \
+  };
+
+#else /* FT_CONFIG_OPTION_PIC */
+
+#define FT_DEFINE_SERVICE_CFFLOADREC( class_,                  \
+                                      get_standard_encoding_,  \
+                                      load_private_dict_,      \
+                                      fd_select_get_,          \
+                                      blend_check_vector_,     \
+                                      blend_build_vector_ )    \
+  void                                                         \
+  FT_Init_Class_ ## class_( FT_Service_CFFLoadRec*  clazz )    \
+  {                                                            \
+    clazz->get_standard_encoding = get_standard_encoding_;     \
+    clazz->load_private_dict     = load_private_dict_;         \
+    clazz->fd_select_get         = fd_select_get_;             \
+    clazz->blend_check_vector    = blend_check_vector_;        \
+    clazz->blend_build_vector    = blend_build_vector_;        \
+  }
+
+#endif /* FT_CONFIG_OPTION_PIC */
+
+
+FT_END_HEADER
+
+
+#endif
+
+
+/* END */
index cce94d8..cb59ac6 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType CID font services (specification).                      */
 /*                                                                         */
-/*  Copyright 2007-2017 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  Derek Clegg and Michael Toftdal.                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 376d925..3b732be 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType font format service (specification only).               */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 0cd1361..f1a68e3 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType glyph dictionary services (specification).              */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -56,7 +56,7 @@ FT_BEGIN_HEADER
 
 #define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \
                                         get_name_,                     \
-                                        name_index_                  \
+                                        name_index_ )                  \
   static const FT_Service_GlyphDictRec  class_ =                       \
   {                                                                    \
     get_name_, name_index_                                             \
@@ -66,7 +66,7 @@ FT_BEGIN_HEADER
 
 #define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \
                                         get_name_,                     \
-                                        name_index_                  \
+                                        name_index_ )                  \
   void                                                                 \
   FT_Init_Class_ ## class_( FT_Library                library,         \
                             FT_Service_GlyphDictRec*  clazz )          \
index 71bfa97..ed79ebe 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  Masatake YAMATO, Red Hat K.K.,                                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index b8344e9..c7e8f6e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType Kerning service (specification).                        */
 /*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 1f7d5dd..abaacdd 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType services for metrics variations (specification).        */
 /*                                                                         */
-/*  Copyright 2016-2017 by                                                 */
+/*  Copyright 2016-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 1d51cd9..bcbb38e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType Multiple Masters and GX var services (specification).   */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -48,11 +48,15 @@ FT_BEGIN_HEADER
                             FT_UInt   num_coords,
                             FT_Long*  coords );
 
+  /* use return value -1 to indicate that the new coordinates  */
+  /* are equal to the current ones; no changes are thus needed */
   typedef FT_Error
   (*FT_Set_Var_Design_Func)( FT_Face    face,
                              FT_UInt    num_coords,
                              FT_Fixed*  coords );
 
+  /* use return value -1 to indicate that the new coordinates  */
+  /* are equal to the current ones; no changes are thus needed */
   typedef FT_Error
   (*FT_Set_MM_Blend_Func)( FT_Face   face,
                            FT_UInt   num_coords,
@@ -64,6 +68,10 @@ FT_BEGIN_HEADER
                              FT_Fixed*  coords );
 
   typedef FT_Error
+  (*FT_Set_Instance_Func)( FT_Face  face,
+                           FT_UInt  instance_index );
+
+  typedef FT_Error
   (*FT_Get_MM_Blend_Func)( FT_Face   face,
                            FT_UInt   num_coords,
                            FT_Long*  coords );
@@ -88,6 +96,7 @@ FT_BEGIN_HEADER
     FT_Get_MM_Var_Func      get_mm_var;
     FT_Set_Var_Design_Func  set_var_design;
     FT_Get_Var_Design_Func  get_var_design;
+    FT_Set_Instance_Func    set_instance;
 
     /* for internal use; only needed for code sharing between modules */
     FT_Get_Var_Blend_Func   get_var_blend;
@@ -97,27 +106,29 @@ FT_BEGIN_HEADER
 
 #ifndef FT_CONFIG_OPTION_PIC
 
-#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,           \
-                                           get_mm_,          \
-                                           set_mm_design_,   \
-                                           set_mm_blend_,    \
-                                           get_mm_blend_,    \
-                                           get_mm_var_,      \
-                                           set_var_design_,  \
-                                           get_var_design_,  \
-                                           get_var_blend_,   \
-                                           done_blend_     ) \
-  static const FT_Service_MultiMastersRec  class_ =          \
-  {                                                          \
-    get_mm_,                                                 \
-    set_mm_design_,                                          \
-    set_mm_blend_,                                           \
-    get_mm_blend_,                                           \
-    get_mm_var_,                                             \
-    set_var_design_,                                         \
-    get_var_design_,                                         \
-    get_var_blend_,                                          \
-    done_blend_                                              \
+#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,          \
+                                           get_mm_,         \
+                                           set_mm_design_,  \
+                                           set_mm_blend_,   \
+                                           get_mm_blend_,   \
+                                           get_mm_var_,     \
+                                           set_var_design_, \
+                                           get_var_design_, \
+                                           set_instance_,   \
+                                           get_var_blend_,  \
+                                           done_blend_ )    \
+  static const FT_Service_MultiMastersRec  class_ =         \
+  {                                                         \
+    get_mm_,                                                \
+    set_mm_design_,                                         \
+    set_mm_blend_,                                          \
+    get_mm_blend_,                                          \
+    get_mm_var_,                                            \
+    set_var_design_,                                        \
+    get_var_design_,                                        \
+    set_instance_,                                          \
+    get_var_blend_,                                         \
+    done_blend_                                             \
   };
 
 #else /* FT_CONFIG_OPTION_PIC */
@@ -130,6 +141,7 @@ FT_BEGIN_HEADER
                                            get_mm_var_,          \
                                            set_var_design_,      \
                                            get_var_design_,      \
+                                           set_instance_,        \
                                            get_var_blend_,       \
                                            done_blend_ )         \
   void                                                           \
@@ -142,6 +154,7 @@ FT_BEGIN_HEADER
     clazz->get_mm_var     = get_mm_var_;                         \
     clazz->set_var_design = set_var_design_;                     \
     clazz->get_var_design = get_var_design_;                     \
+    clazz->set_instance   = set_instance_;                       \
     clazz->get_var_blend  = get_var_blend_;                      \
     clazz->done_blend     = done_blend_;                         \
   }
index ac84abe..3129429 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType OpenType validation service (specification).            */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index c9a182f..e65d57e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Internal PFR service functions (specification).                      */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 022cdec..4a49d8b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType PostScript name services (specification).               */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index eb2d4ee..adc0bcf 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType property service (specification).                       */
 /*                                                                         */
-/*  Copyright 2012-2017 by                                                 */
+/*  Copyright 2012-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index b32122e..5589575 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType PostScript charmap service (specification).             */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 0220ce5..408f406 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType PostScript info service (specification).                */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 49d18e4..e8b37bc 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType SFNT table loading service (specification).             */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 30f7fee..cd0e6fd 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType TrueType/sfnt cmap extra information service.           */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  Masatake YAMATO, Redhat K.K.,                                          */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index e4b368a..92e3c54 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType TrueType engine query service (specification).          */
 /*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index b779305..16fac1c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType TrueType glyph service.                                 */
 /*                                                                         */
-/*  Copyright 2007-2017 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  David Turner.                                                          */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index c94b7e1..80d481c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType Windows FNT/FONT service (specification).               */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index b8667a0..fb1e327 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level `sfnt' driver interface (specification).                  */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index b2e35d4..2118e33 100644 (file)
@@ -5,7 +5,7 @@
 /*    Basic Type1/Type2 type definitions and interface (specification      */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index c0758e2..10dd336 100644 (file)
@@ -5,7 +5,7 @@
 /*    Basic SFNT/TrueType type definitions and interface (specification    */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -148,7 +148,7 @@ FT_BEGIN_HEADER
   /* <Fields>                                                              */
   /*    See                                                                */
   /*                                                                       */
-  /*      http://www.w3.org/TR/WOFF/#WOFFHeader                            */
+  /*      https://www.w3.org/TR/WOFF/#WOFFHeader                           */
   /*                                                                       */
   typedef struct  WOFF_HeaderRec_
   {
@@ -1299,10 +1299,6 @@ FT_BEGIN_HEADER
   /*                            variation tables (rather like Multiple     */
   /*                            Master data).                              */
   /*                                                                       */
-  /*    is_default_instance  :: Set if the glyph outlines can be used      */
-  /*                            unmodified (i.e., without applying glyph   */
-  /*                            variation deltas).                         */
-  /*                                                                       */
   /*    variation_support    :: Flags that indicate which OpenType         */
   /*                            functionality related to font variation    */
   /*                            support is present, valid, and usable.     */
@@ -1445,6 +1441,9 @@ FT_BEGIN_HEADER
     void*                 var;
 #endif
 
+    /* a typeless pointer to the PostScript Aux service */
+    void*                 psaux;
+
 
     /***********************************************************************/
     /*                                                                     */
@@ -1509,7 +1508,6 @@ FT_BEGIN_HEADER
     FT_Bool               doblend;
     GX_Blend              blend;
 
-    FT_Bool               is_default_instance;   /* since 2.7.1 */
     FT_UInt32             variation_support;     /* since 2.7.1 */
 
     const char*           var_postscript_prefix;     /* since 2.7.2 */
index 3f6b36e..3503c26 100644 (file)
@@ -5,7 +5,7 @@
 /*    Basic Type 1/Type 2 tables definitions and interface (specification  */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -554,6 +554,9 @@ FT_BEGIN_HEADER
   /*    T1_ENCODING_TYPE_ISOLATIN1 ::                                      */
   /*    T1_ENCODING_TYPE_EXPERT ::                                         */
   /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.4.8                                                              */
+  /*                                                                       */
   typedef enum  T1_EncodingType_
   {
     T1_ENCODING_TYPE_NONE = 0,
@@ -622,6 +625,9 @@ FT_BEGIN_HEADER
   /*    PS_DICT_FS_TYPE ::                                                 */
   /*    PS_DICT_ITALIC_ANGLE ::                                            */
   /*                                                                       */
+  /* <Since>                                                               */
+  /*    2.4.8                                                              */
+  /*                                                                       */
   typedef enum  PS_Dict_Keys_
   {
     /* conventionally in the font dictionary */
@@ -743,6 +749,9 @@ FT_BEGIN_HEADER
    *    If the font's format is not PostScript-based, this function returns
    *    the `FT_Err_Invalid_Argument' error code.
    *
+   * @since:
+   *    2.4.8
+   *
    */
   FT_EXPORT( FT_Long )
   FT_Get_PS_Font_Value( FT_Face       face,
index 494d677..8605183 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType name ID definitions (specification only).                   */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -437,7 +437,7 @@ FT_BEGIN_HEADER
    *
    *   The canonical source for Microsoft's IDs is
    *
-   *     http://www.microsoft.com/globaldev/reference/lcid-all.mspx ,
+   *     https://www.microsoft.com/globaldev/reference/lcid-all.mspx ,
    *
    *   however, we only provide macros for language identifiers present in
    *   the OpenType specification: Microsoft has abandoned the concept of
index 5831204..ce6a617 100644 (file)
@@ -5,7 +5,7 @@
 /*    Basic SFNT/TrueType tables definitions and interface                 */
 /*    (specification only).                                                */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 32eb2fd..e5cee68 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Tags for TrueType and OpenType tables (specification only).          */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -106,6 +106,12 @@ FT_BEGIN_HEADER
 #define TTAG_VVAR  FT_MAKE_TAG( 'V', 'V', 'A', 'R' )
 #define TTAG_wOFF  FT_MAKE_TAG( 'w', 'O', 'F', 'F' )
 
+/* used by "Keyboard.dfont" on legacy Mac OS X */
+#define TTAG_0xA5kbd  FT_MAKE_TAG( 0xA5, 'k', 'b', 'd' )
+
+/* used by "LastResort.dfont" on legacy Mac OS X */
+#define TTAG_0xA5lst  FT_MAKE_TAG( 0xA5, 'l', 's', 't' )
+
 
 FT_END_HEADER
 
diff --git a/include/freetype/ttunpat.h b/include/freetype/ttunpat.h
deleted file mode 100644 (file)
index f5e4170..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttunpat.h                                                              */
-/*                                                                         */
-/*    Definitions for the unpatented TrueType hinting system.              */
-/*    Obsolete, retained for backward compatibility.                       */
-/*                                                                         */
-/*  Copyright 2003-2017 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:
-  *   Deprecated.
-  *
-  *   Previously: 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 */
index e7d808f..e7ce99b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType 2 build and setup macros.                                   */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 517111e..6ce0f3e 100644 (file)
@@ -1,6 +1,6 @@
 # modules.cfg
 #
-# Copyright 2005-2017 by
+# Copyright 2005-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -42,7 +42,7 @@ FONT_MODULES += type1
 
 # CFF/OpenType font driver.
 #
-# This driver needs the `sfnt', `pshinter', and `psnames' modules.
+# This driver needs the `sfnt', `psaux', `pshinter', and `psnames' modules.
 FONT_MODULES += cff
 
 # Type 1 CID-keyed font driver.
index c0bc022..562480c 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 9a3dc8a..01b866e 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/autofit Jamfile
 #
-# Copyright 2003-2017 by
+# Copyright 2003-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index ccdae84..c65a3ae 100644 (file)
@@ -5,7 +5,7 @@
 /*    Routines used to compute vector angles with limited accuracy         */
 /*    and very high speed.  It also contains sorting routines (body).      */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index a00c3a0..61ab795 100644 (file)
@@ -7,7 +7,7 @@
 /*                                                                         */
 /*    Auto-fitter data for blue strings (body).                            */
 /*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
     { AF_BLUE_STRING_KAYAH_LI_DESCENDER,       0                                 },
     { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0                                 },
     { AF_BLUE_STRING_MAX,                      0                                 },
-    { AF_BLUE_STRING_KANNADA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
-    { AF_BLUE_STRING_KANNADA_BOTTOM, 0                          },
-    { AF_BLUE_STRING_MAX,            0                          },
     { AF_BLUE_STRING_KHMER_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
     { AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP,   AF_BLUE_PROPERTY_LATIN_SUB_TOP    },
                                                   AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
     { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0                                 },
     { AF_BLUE_STRING_MAX,                         0                                 },
+    { AF_BLUE_STRING_KANNADA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_KANNADA_BOTTOM, 0                          },
+    { AF_BLUE_STRING_MAX,            0                          },
     { AF_BLUE_STRING_LAO_TOP,            AF_BLUE_PROPERTY_LATIN_TOP      |
                                          AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
     { AF_BLUE_STRING_LAO_BOTTOM,         0                                 },
     { AF_BLUE_STRING_TELUGU_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_TELUGU_BOTTOM, 0                          },
     { AF_BLUE_STRING_MAX,           0                          },
+    { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP },
+    { AF_BLUE_STRING_TIFINAGH, 0                          },
+    { AF_BLUE_STRING_MAX,      0                          },
     { AF_BLUE_STRING_THAI_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   },
     { AF_BLUE_STRING_THAI_BOTTOM,          0                                 },
     { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0                                 },
     { AF_BLUE_STRING_THAI_DIGIT_TOP,       0                                 },
     { AF_BLUE_STRING_MAX,                  0                                 },
-    { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP },
-    { AF_BLUE_STRING_TIFINAGH, 0                          },
-    { AF_BLUE_STRING_MAX,      0                          },
     { AF_BLUE_STRING_VAI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP },
     { AF_BLUE_STRING_VAI_BOTTOM, 0                          },
     { AF_BLUE_STRING_MAX,        0                          },
index f9080c5..4913e2e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter data for blue strings (body).                            */
 /*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 454923e..d3cc428 100644 (file)
@@ -2,7 +2,7 @@
 //
 //    Auto-fitter data for blue strings.
 //
-//  Copyright 2013-2017 by
+//  Copyright 2013-2018 by
 //  David Turner, Robert Wilhelm, and Werner Lemberg.
 //
 //  This file is part of the FreeType project, and may only be used,
@@ -872,11 +872,6 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
     { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0                                 }
     { AF_BLUE_STRING_MAX,                      0                                 }
 
-  AF_BLUE_STRINGSET_KNDA
-    { AF_BLUE_STRING_KANNADA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
-    { AF_BLUE_STRING_KANNADA_BOTTOM, 0                          }
-    { AF_BLUE_STRING_MAX,            0                          }
-
   AF_BLUE_STRINGSET_KHMR
     { AF_BLUE_STRING_KHMER_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
                                             AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
@@ -892,6 +887,11 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
     { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0                                 }
     { AF_BLUE_STRING_MAX,                         0                                 }
 
+  AF_BLUE_STRINGSET_KNDA
+    { AF_BLUE_STRING_KANNADA_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_KANNADA_BOTTOM, 0                          }
+    { AF_BLUE_STRING_MAX,            0                          }
+
   AF_BLUE_STRINGSET_LAO
     { AF_BLUE_STRING_LAO_TOP,            AF_BLUE_PROPERTY_LATIN_TOP      |
                                          AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
@@ -1027,6 +1027,11 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
     { AF_BLUE_STRING_TELUGU_BOTTOM, 0                          }
     { AF_BLUE_STRING_MAX,           0                          }
 
+  AF_BLUE_STRINGSET_TFNG
+    { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP }
+    { AF_BLUE_STRING_TIFINAGH, 0                          }
+    { AF_BLUE_STRING_MAX,      0                          }
+
   AF_BLUE_STRINGSET_THAI
     { AF_BLUE_STRING_THAI_TOP,             AF_BLUE_PROPERTY_LATIN_TOP      |
                                            AF_BLUE_PROPERTY_LATIN_X_HEIGHT   }
@@ -1038,11 +1043,6 @@ AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN:
     { AF_BLUE_STRING_THAI_DIGIT_TOP,       0                                 }
     { AF_BLUE_STRING_MAX,                  0                                 }
 
-  AF_BLUE_STRINGSET_TFNG
-    { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP }
-    { AF_BLUE_STRING_TIFINAGH, 0                          }
-    { AF_BLUE_STRING_MAX,      0                          }
-
   AF_BLUE_STRINGSET_VAII
     { AF_BLUE_STRING_VAI_TOP,    AF_BLUE_PROPERTY_LATIN_TOP }
     { AF_BLUE_STRING_VAI_BOTTOM, 0                          }
index e227dbf..56b591a 100644 (file)
@@ -7,7 +7,7 @@
 /*                                                                         */
 /*    Auto-fitter data for blue strings (specification).                   */
 /*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -344,9 +344,9 @@ FT_BEGIN_HEADER
     AF_BLUE_STRINGSET_GURU = 116,
     AF_BLUE_STRINGSET_HEBR = 122,
     AF_BLUE_STRINGSET_KALI = 126,
-    AF_BLUE_STRINGSET_KNDA = 132,
-    AF_BLUE_STRINGSET_KHMR = 135,
-    AF_BLUE_STRINGSET_KHMS = 141,
+    AF_BLUE_STRINGSET_KHMR = 132,
+    AF_BLUE_STRINGSET_KHMS = 138,
+    AF_BLUE_STRINGSET_KNDA = 141,
     AF_BLUE_STRINGSET_LAO = 144,
     AF_BLUE_STRINGSET_LATN = 150,
     AF_BLUE_STRINGSET_LATB = 157,
@@ -367,8 +367,8 @@ FT_BEGIN_HEADER
     AF_BLUE_STRINGSET_TAML = 222,
     AF_BLUE_STRINGSET_TAVT = 225,
     AF_BLUE_STRINGSET_TELU = 228,
-    AF_BLUE_STRINGSET_THAI = 231,
-    AF_BLUE_STRINGSET_TFNG = 239,
+    AF_BLUE_STRINGSET_TFNG = 231,
+    AF_BLUE_STRINGSET_THAI = 234,
     AF_BLUE_STRINGSET_VAII = 242,
     af_blue_2_1 = 245,
 #ifdef AF_CONFIG_OPTION_CJK
index 268bcbc..682147c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter data for blue strings (specification).                   */
 /*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 61e29cd..21b6bff 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter hinting routines for CJK writing system (body).          */
 /*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -16,9 +16,9 @@
 /***************************************************************************/
 
   /*
-   *  The algorithm is based on akito's autohint patch, available here:
+   *  The algorithm is based on akito's autohint patch, archived at
    *
-   *  http://www.kde.gr.jp/~akito/patch/freetype2/
+   *  https://web.archive.org/web/20051219160454/http://www.kde.gr.jp:80/~akito/patch/freetype2/2.1.7/
    *
    */
 
       goto Exit;
 
     /* analyze glyph outline */
-#ifdef AF_CONFIG_OPTION_USE_WARPER
-    if ( ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT &&
-           AF_HINTS_DO_WARP( hints )                                ) ||
-         AF_HINTS_DO_HORIZONTAL( hints )                              )
-#else
     if ( AF_HINTS_DO_HORIZONTAL( hints ) )
-#endif
     {
       error = af_cjk_hints_detect_features( hints, AF_DIMENSION_HORZ );
       if ( error )
       {
 
 #ifdef AF_CONFIG_OPTION_USE_WARPER
-        if ( dim == AF_DIMENSION_HORZ                                 &&
-             metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT &&
-             AF_HINTS_DO_WARP( hints )                                )
+        if ( dim == AF_DIMENSION_HORZ                                  &&
+             metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL &&
+             AF_HINTS_DO_WARP( hints )                                 )
         {
           AF_WarperRec  warper;
           FT_Fixed      scale;
index 84f892f..d229c0c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter hinting routines for CJK writing system (specification). */
 /*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 1b18c66..6eeb8fc 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter coverages (specification only).                          */
 /*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 61c32db..f30c517 100644 (file)
@@ -5,7 +5,7 @@
 /*    Auto-fitter dummy routines to be used if no hinting should be        */
 /*    performed (body).                                                    */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index ebaa7d7..b382acd 100644 (file)
@@ -5,7 +5,7 @@
 /*    Auto-fitter dummy routines to be used if no hinting should be        */
 /*    performed (specification).                                           */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index dde182f..e5de543 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Autofitter error codes (specification only).                         */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 85bef00..3d09c53 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter routines to compute global hinting values (body).        */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index de6142e..489ed46 100644 (file)
@@ -5,7 +5,7 @@
 /*    Auto-fitter routines to compute global hinting values                */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index f1ff0ba..0666dbc 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter hinting routines (body).                                 */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
     AF_DUMP(( "Table of points:\n" ));
 
     if ( hints->num_points )
+    {
       AF_DUMP(( "  index  hedge  hseg  vedge  vseg  flags "
+             /* "  XXXXX  XXXXX XXXXX  XXXXX XXXXX  XXXXXX" */
                 "  xorg  yorg  xscale  yscale   xfit    yfit" ));
+             /* " XXXXX XXXXX XXXX.XX XXXX.XX XXXX.XX XXXX.XX" */
+    }
     else
       AF_DUMP(( "  (none)\n" ));
 
                 dimension == AF_DIMENSION_HORZ ? "vertical"
                                                : "horizontal" ));
       if ( axis->num_segments )
+      {
         AF_DUMP(( "  index   pos   delta   dir   from   to "
+               /* "  XXXXX  XXXXX  XXXXX  XXXXX  XXXX  XXXX" */
                   "  link  serif  edge"
+               /* "  XXXX  XXXXX  XXXX" */
                   "  height  extra     flags\n" ));
+               /* "  XXXXXX  XXXXX  XXXXXXXXXXX" */
+      }
       else
         AF_DUMP(( "  (none)\n" ));
 
       return FT_THROW( Invalid_Argument );
 
     seg      = &axis->segments[idx];
-    *offset  = ( dim == AF_DIMENSION_HORZ ) ? seg->first->ox
-                                            : seg->first->oy;
+    *offset  = ( dim == AF_DIMENSION_HORZ ) ? seg->first->fx
+                                            : seg->first->fy;
     if ( seg->edge )
       *is_blue = (FT_Bool)( seg->edge->blue_edge != 0 );
     else
       *is_blue = FALSE;
 
     if ( *is_blue )
-      *blue_offset = seg->edge->blue_edge->cur;
+      *blue_offset = seg->edge->blue_edge->org;
     else
       *blue_offset = 0;
 
                   10.0 * hints->y_scale / 65536.0 / 64.0 ));
 
       if ( axis->num_edges )
+      {
         AF_DUMP(( "  index    pos     dir   link  serif"
+               /* "  XXXXX  XXXX.XX  XXXXX  XXXX  XXXXX" */
                   "  blue    opos     pos       flags\n" ));
+               /* "    X   XXXX.XX  XXXX.XX  XXXXXXXXXXX" */
+      }
       else
         AF_DUMP(( "  (none)\n" ));
 
index 16638b1..3326ebc 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter hinting routines (specification).                        */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -62,7 +62,7 @@ FT_BEGIN_HEADER
    *
    *  by David Turner and Werner Lemberg
    *
-   *    http://www.tug.org/TUGboat/Articles/tb24-3/lemberg.pdf
+   *    https://www.tug.org/TUGboat/Articles/tb24-3/lemberg.pdf
    *
    *  with appropriate updates.
    *
index 23be46e..dfbea5f 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter hinting routines for Indic writing system (body).        */
 /*                                                                         */
-/*  Copyright 2007-2017 by                                                 */
+/*  Copyright 2007-2018 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,       */
index ec9e263..5688738 100644 (file)
@@ -5,7 +5,7 @@
 /*    Auto-fitter hinting routines for Indic writing system                */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2007-2017 by                                                 */
+/*  Copyright 2007-2018 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,       */
index 11fa523..9f1b540 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter hinting routines for latin writing system (body).        */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
                 if ( prev_max_on_coord > max_on_coord )
                   max_on_coord = prev_max_on_coord;
 
-                prev_segment->last = point;
-                prev_segment->pos  = (FT_Short)( ( min_pos +
-                                                   max_pos ) >> 1 );
+                prev_segment->last  = point;
+                prev_segment->pos   = (FT_Short)( ( min_pos +
+                                                    max_pos ) >> 1 );
+                prev_segment->delta = (FT_Short)( ( max_pos -
+                                                    min_pos ) >> 1 );
 
                 if ( ( min_flags | max_flags ) & AF_FLAG_CONTROL      &&
                      ( max_on_coord - min_on_coord ) < flat_threshold )
                   if ( max_pos > prev_max_pos )
                     prev_max_pos = max_pos;
 
-                  prev_segment->last = point;
-                  prev_segment->pos  = (FT_Short)( ( prev_min_pos +
-                                                     prev_max_pos ) >> 1 );
+                  prev_segment->last  = point;
+                  prev_segment->pos   = (FT_Short)( ( prev_min_pos +
+                                                      prev_max_pos ) >> 1 );
+                  prev_segment->delta = (FT_Short)( ( prev_max_pos -
+                                                      prev_min_pos ) >> 1 );
                 }
                 else
                 {
                   if ( prev_max_pos > max_pos )
                     max_pos = prev_max_pos;
 
-                  segment->last = point;
-                  segment->pos  = (FT_Short)( ( min_pos + max_pos ) >> 1 );
+                  segment->last  = point;
+                  segment->pos   = (FT_Short)( ( min_pos + max_pos ) >> 1 );
+                  segment->delta = (FT_Short)( ( max_pos - min_pos ) >> 1 );
 
                   if ( ( min_flags | max_flags ) & AF_FLAG_CONTROL      &&
                        ( max_on_coord - min_on_coord ) < flat_threshold )
       goto Exit;
 
     /* analyze glyph outline */
-#ifdef AF_CONFIG_OPTION_USE_WARPER
-    if ( ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT &&
-           AF_HINTS_DO_WARP( hints )                                ) ||
-         AF_HINTS_DO_HORIZONTAL( hints )                              )
-#else
     if ( AF_HINTS_DO_HORIZONTAL( hints ) )
-#endif
     {
       axis  = &metrics->axis[AF_DIMENSION_HORZ];
       error = af_latin_hints_detect_features( hints,
     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_HINTS_DO_WARP( hints )                                )
+      if ( dim == AF_DIMENSION_HORZ                                  &&
+           metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL &&
+           AF_HINTS_DO_WARP( hints )                                 )
       {
         AF_WarperRec  warper;
         FT_Fixed      scale;
index d80e125..432cccc 100644 (file)
@@ -5,7 +5,7 @@
 /*    Auto-fitter hinting routines for latin writing system                */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 0607278..5c71378 100644 (file)
@@ -9,7 +9,7 @@
 /*                                                                         */
 /*    Auto-fitter hinting routines for latin writing system (body).        */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
       goto Exit;
 
     /* analyze glyph outline */
-#ifdef AF_CONFIG_OPTION_USE_WARPER
-    if ( ( metrics->root.scaler.render_mode == FT_RENDER_MODE_LIGHT &&
-           AF_HINTS_DO_WARP( hints )                                ) ||
-         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 )
     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_HINTS_DO_WARP( hints )                                )
+      if ( dim == AF_DIMENSION_HORZ                                  &&
+           metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL &&
+           AF_HINTS_DO_WARP( hints )                                 )
       {
         AF_WarperRec  warper;
         FT_Fixed      scale;
index 2d0b154..0129dc7 100644 (file)
@@ -10,7 +10,7 @@
 /*    Auto-fitter hinting routines for latin writing system                */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 78c4368..a55550b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter glyph loading routines (body).                           */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
           FT_Pos  pp2x = loader->pp2.x;
 
 
-          loader->pp1.x = FT_PIX_ROUND( pp1x );
-          loader->pp2.x = FT_PIX_ROUND( pp2x );
+          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;
         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 );
+        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;
index 2578abe..d4d72d1 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter glyph loading routines (specification).                  */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 9d7ba22..dcaa17a 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter module implementation (body).                            */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -56,7 +56,7 @@
 
 #include FT_INTERNAL_OBJECTS_H
 #include FT_INTERNAL_DEBUG_H
-#include FT_AUTOHINTER_H
+#include FT_DRIVER_H
 #include FT_SERVICE_PROPERTIES_H
 
 
index 0571d14..56f64ea 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter module implementation (specification).                   */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 3125e03..d48d016 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for autofit module.  */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 8cd3392..0c73456 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for autofit module.  */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 7f37eea..1355c5e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter Unicode script ranges (body).                            */
 /*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 72d9eaa..ba3b5e7 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter Unicode script ranges (specification).                   */
 /*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 7547a9e..6ac193f 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter scripts (specification only).                            */
 /*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
           HINTING_BOTTOM_TO_TOP,
           "\xEA\xA4\x8D \xEA\xA4\x80" ) /* ꤍ ꤀ */
 
-  SCRIPT( knda, KNDA,
-          "Kannada",
-          HB_SCRIPT_KANNADA,
-          HINTING_BOTTOM_TO_TOP,
-          "\xE0\xB3\xA6 \xE0\xB2\xAC" ) /* ೦ ಬ */
-
   /* only digit zero has a simple shape in the Khmer script */
   SCRIPT( khmr, KHMR,
           "Khmer",
           HINTING_BOTTOM_TO_TOP,
           "\xE1\xA7\xA1 \xE1\xA7\xAA" ) /* ᧡ ᧪ */
 
+  SCRIPT( knda, KNDA,
+          "Kannada",
+          HB_SCRIPT_KANNADA,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE0\xB3\xA6 \xE0\xB2\xAC" ) /* ೦ ಬ */
+
   /* only digit zero has a simple shape in the Lao script */
   SCRIPT( lao, LAO,
           "Lao",
           HINTING_BOTTOM_TO_TOP,
           "\xE0\xB1\xA6 \xE0\xB1\xA7" ) /* ౦ ౧ */
 
-  SCRIPT( thai, THAI,
-          "Thai",
-          HB_SCRIPT_THAI,
-          HINTING_BOTTOM_TO_TOP,
-          "\xE0\xB8\xB2 \xE0\xB9\x85 \xE0\xB9\x90" ) /* า ๅ ๐ */
-
   SCRIPT( tfng, TFNG,
           "Tifinagh",
           HB_SCRIPT_TIFINAGH,
           HINTING_BOTTOM_TO_TOP,
           "\xE2\xB5\x94" ) /* ⵔ */
 
+  SCRIPT( thai, THAI,
+          "Thai",
+          HB_SCRIPT_THAI,
+          HINTING_BOTTOM_TO_TOP,
+          "\xE0\xB8\xB2 \xE0\xB9\x85 \xE0\xB9\x90" ) /* า ๅ ๐ */
+
   SCRIPT( vaii, VAII,
           "Vai",
           HB_SCRIPT_VAI,
index da92fad..f308281 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    HarfBuzz interface for accessing OpenType features (body).           */
 /*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -18,6 +18,7 @@
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
+#include FT_ADVANCES_H
 #include "afglobal.h"
 #include "aftypes.h"
 #include "afshaper.h"
   {
     hb_face_t*  face;
 
-    hb_set_t*  gsub_lookups /* GSUB lookups for a given script */
-    hb_set_t*  gsub_glyphs;   /* glyphs covered by GSUB lookups  */
-    hb_set_t*  gpos_lookups /* GPOS lookups for a given script */
-    hb_set_t*  gpos_glyphs;   /* glyphs covered by GPOS lookups  */
+    hb_set_t*  gsub_lookups = NULL; /* GSUB lookups for a given script */
+    hb_set_t*  gsub_glyphs  = NULL; /* glyphs covered by GSUB lookups  */
+    hb_set_t*  gpos_lookups = NULL; /* GPOS lookups for a given script */
+    hb_set_t*  gpos_glyphs  = NULL; /* glyphs covered by GPOS lookups  */
 
     hb_script_t      script;
     const hb_tag_t*  coverage_tags;
 
     face = hb_font_get_face( globals->hb_font );
 
-    gsub_lookups = hb_set_create();
-    gsub_glyphs  = hb_set_create();
-    gpos_lookups = hb_set_create();
-    gpos_glyphs  = hb_set_create();
-
     coverage_tags = coverages[style_class->coverage];
     script        = scripts[style_class->script];
 
         script_tags[1] = HB_TAG_NONE;
     }
 
+    gsub_lookups = hb_set_create();
     hb_ot_layout_collect_lookups( face,
                                   HB_OT_TAG_GSUB,
                                   script_tags,
     if ( hb_set_is_empty( gsub_lookups ) )
       goto Exit; /* nothing to do */
 
-    hb_ot_layout_collect_lookups( face,
-                                  HB_OT_TAG_GPOS,
-                                  script_tags,
-                                  NULL,
-                                  coverage_tags,
-                                  gpos_lookups );
-
     FT_TRACE4(( "GSUB lookups (style `%s'):\n"
                 " ",
                 af_style_names[style_class->style] ));
     count = 0;
 #endif
 
+    gsub_glyphs = hb_set_create();
     for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, &idx ); )
     {
 #ifdef FT_DEBUG_LEVEL_TRACE
                 " ",
                 af_style_names[style_class->style] ));
 
+    gpos_lookups = hb_set_create();
+    hb_ot_layout_collect_lookups( face,
+                                  HB_OT_TAG_GPOS,
+                                  script_tags,
+                                  NULL,
+                                  coverage_tags,
+                                  gpos_lookups );
+
 #ifdef FT_DEBUG_LEVEL_TRACE
     count = 0;
 #endif
 
+    gpos_glyphs = hb_set_create();
     for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gpos_lookups, &idx ); )
     {
 #ifdef FT_DEBUG_LEVEL_TRACE
index 9185d19..7efd9f6 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    HarfBuzz interface for accessing OpenType features (specification).  */
 /*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index a5e13d8..e2688b3 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter styles (specification only).                             */
 /*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
          AF_BLUE_STRINGSET_KALI,
          AF_COVERAGE_DEFAULT )
 
-  STYLE( knda_dflt, KNDA_DFLT,
-         "Kannada default style",
-         AF_WRITING_SYSTEM_LATIN,
-         AF_SCRIPT_KNDA,
-         AF_BLUE_STRINGSET_KNDA,
-         AF_COVERAGE_DEFAULT )
-
   STYLE( khmr_dflt, KHMR_DFLT,
          "Khmer default style",
          AF_WRITING_SYSTEM_LATIN,
          AF_BLUE_STRINGSET_KHMS,
          AF_COVERAGE_DEFAULT )
 
+  STYLE( knda_dflt, KNDA_DFLT,
+         "Kannada default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_KNDA,
+         AF_BLUE_STRINGSET_KNDA,
+         AF_COVERAGE_DEFAULT )
+
   STYLE( lao_dflt, LAO_DFLT,
          "Lao default style",
          AF_WRITING_SYSTEM_LATIN,
          AF_BLUE_STRINGSET_TELU,
          AF_COVERAGE_DEFAULT )
 
-  STYLE( thai_dflt, THAI_DFLT,
-         "Thai default style",
-         AF_WRITING_SYSTEM_LATIN,
-         AF_SCRIPT_THAI,
-         AF_BLUE_STRINGSET_THAI,
-         AF_COVERAGE_DEFAULT )
-
   STYLE( tfng_dflt, TFNG_DFLT,
          "Tifinagh default style",
          AF_WRITING_SYSTEM_LATIN,
          AF_BLUE_STRINGSET_TFNG,
          AF_COVERAGE_DEFAULT )
 
+  STYLE( thai_dflt, THAI_DFLT,
+         "Thai default style",
+         AF_WRITING_SYSTEM_LATIN,
+         AF_SCRIPT_THAI,
+         AF_BLUE_STRINGSET_THAI,
+         AF_COVERAGE_DEFAULT )
+
   STYLE( vaii_dflt, VAII_DFLT,
          "Vai default style",
          AF_WRITING_SYSTEM_LATIN,
index 718dab7..a500134 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter types (specification only).                              */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index f99aa6d..2a75ea7 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter warping algorithm (body).                                */
 /*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 2e85cbd..520b1be 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter warping algorithm (specification).                       */
 /*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 86749a2..4675f32 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter writing systems (specification only).                    */
 /*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index bbedad7..c160516 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auto-fitter module (body).                                           */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index c4e249b..ff05f83 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2003-2017 by
+# Copyright 2003-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index ec4e130..75171b4 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2003-2017 by
+# Copyright 2003-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 9e9a91b..2b47b8a 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/base Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -26,6 +26,7 @@ SubDir  FT2_TOP $(FT2_SRC_DIR) base ;
                ftobjs
                ftoutln
                ftpic
+               ftpsprop
                ftrfork
                ftsnames
                ftstream
index 57fb816..bc80406 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for base.            */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 258d4ce..492d1ed 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for base.            */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 1557607..230c84d 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Quick computation of advance widths (body).                          */
 /*                                                                         */
-/*  Copyright 2008-2017 by                                                 */
+/*  Copyright 2008-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
                    FT_Int32   flags,
                    FT_Fixed  *padvances )
   {
+    FT_Error  error = FT_Err_Ok;
+
     FT_Face_GetAdvancesFunc  func;
-    FT_UInt                  num, end, nn;
-    FT_Error                 error = FT_Err_Ok;
+
+    FT_UInt  num, end, nn;
+    FT_Int   factor;
 
 
     if ( !face )
       return FT_THROW( Unimplemented_Feature );
 
     flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
+    factor = ( flags & FT_LOAD_NO_SCALE ) ? 1 : 1024;
     for ( nn = 0; nn < count; nn++ )
     {
       error = FT_Load_Glyph( face, start + nn, flags );
       if ( error )
         break;
 
-      /* scale from 26.6 to 16.16 */
+      /* scale from 26.6 to 16.16, unless NO_SCALE was requested */
       padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
-                      ? face->glyph->advance.y * 1024
-                      : face->glyph->advance.x * 1024;
+                      ? face->glyph->advance.y * factor
+                      : face->glyph->advance.x * factor;
     }
 
     return error;
index 4262d37..32d6e95 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType compatibility functions (body).                         */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 55f7359..a1bdbaf 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Single object library component (body only).                         */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -29,6 +29,7 @@
 #include "ftobjs.c"
 #include "ftoutln.c"
 #include "ftpic.c"
+#include "ftpsprop.c"
 #include "ftrfork.c"
 #include "ftsnames.c"
 #include "ftstream.c"
index 2072284..7e8cfad 100644 (file)
@@ -2,9 +2,9 @@
 /*                                                                         */
 /*  ftbase.h                                                               */
 /*                                                                         */
-/*    The FreeType private functions used in base module (specification).  */
+/*    Private functions used in the `base' module (specification).         */
 /*                                                                         */
-/*  Copyright 2008-2017 by                                                 */
+/*  Copyright 2008-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -27,6 +27,8 @@
 FT_BEGIN_HEADER
 
 
+#ifdef FT_CONFIG_OPTION_MAC_FONTS
+
   /* MacOS resource fork cannot exceed 16MB at least for Carbon code; */
   /* see https://support.microsoft.com/en-us/kb/130437                */
 #define FT_MAC_RFORK_MAX_LEN  0x00FFFFFFUL
@@ -65,6 +67,8 @@ FT_BEGIN_HEADER
   ft_raccess_rule_by_darwin_vfs( FT_Library library, FT_UInt  rule_index );
 #endif
 
+#endif /* FT_CONFIG_OPTION_MAC_FONTS */
+
 
 FT_END_HEADER
 
index 6e19da6..151e85c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType bbox computation (body).                                    */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used        */
index 40f0ca2..c4ea502 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing BDF-specific strings (body).              */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 88c88c4..93efb09 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType utility functions for bitmaps (body).                       */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
                            FT_UInt     ypixels )
   {
     FT_Error        error;
-    int             pitch;
-    int             new_pitch;
+    unsigned int    pitch;
+    unsigned int    new_pitch;
     FT_UInt         bpp;
-    FT_UInt         i, width, height;
+    FT_UInt         width, height;
     unsigned char*  buffer = NULL;
 
 
     width  = bitmap->width;
     height = bitmap->rows;
-    pitch  = bitmap->pitch;
-    if ( pitch < 0 )
-      pitch = -pitch;
+    pitch  = (unsigned int)FT_ABS( bitmap->pitch );
 
     switch ( bitmap->pixel_mode )
     {
     case FT_PIXEL_MODE_MONO:
       bpp       = 1;
-      new_pitch = (int)( ( width + xpixels + 7 ) >> 3 );
+      new_pitch = ( width + xpixels + 7 ) >> 3;
       break;
     case FT_PIXEL_MODE_GRAY2:
       bpp       = 2;
-      new_pitch = (int)( ( width + xpixels + 3 ) >> 2 );
+      new_pitch = ( width + xpixels + 3 ) >> 2;
       break;
     case FT_PIXEL_MODE_GRAY4:
       bpp       = 4;
-      new_pitch = (int)( ( width + xpixels + 1 ) >> 1 );
+      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 = (int)( width + xpixels );
+      new_pitch = width + xpixels;
       break;
     default:
       return FT_THROW( Invalid_Glyph_Format );
     if ( ypixels == 0 && new_pitch <= pitch )
     {
       /* zero the padding */
-      FT_UInt  bit_width = (FT_UInt)pitch * 8;
+      FT_UInt  bit_width = pitch * 8;
       FT_UInt  bit_last  = ( width + xpixels ) * bpp;
 
 
     }
 
     /* otherwise allocate new buffer */
-    if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) )
+    if ( FT_QALLOC_MULT( buffer, bitmap->rows + ypixels, new_pitch ) )
       return error;
 
     /* new rows get added at the top of the bitmap, */
     {
       FT_UInt  len = ( width * bpp + 7 ) >> 3;
 
+      unsigned char*  in  = bitmap->buffer;
+      unsigned char*  out = buffer;
+
+      unsigned char*  limit = bitmap->buffer + pitch * bitmap->rows;
+      unsigned int    delta = new_pitch - pitch;
+
+
+      FT_MEM_ZERO( out, new_pitch * ypixels );
+      out += new_pitch * ypixels;
 
-      for ( i = 0; i < bitmap->rows; i++ )
-        FT_MEM_COPY( buffer + (FT_UInt)new_pitch * ( ypixels + i ),
-                     bitmap->buffer + (FT_UInt)pitch * i,
-                     len );
+      while ( in < limit )
+      {
+        FT_MEM_COPY( out, in, len );
+        in  += pitch;
+        out += pitch;
+
+        FT_MEM_ZERO( out, delta );
+        out += delta;
+      }
     }
     else
     {
       FT_UInt  len = ( width * bpp + 7 ) >> 3;
 
+      unsigned char*  in  = bitmap->buffer;
+      unsigned char*  out = buffer;
+
+      unsigned char*  limit = bitmap->buffer + pitch * bitmap->rows;
+      unsigned int    delta = new_pitch - pitch;
 
-      for ( i = 0; i < bitmap->rows; i++ )
-        FT_MEM_COPY( buffer + (FT_UInt)new_pitch * i,
-                     bitmap->buffer + (FT_UInt)pitch * i,
-                     len );
+
+      while ( in < limit )
+      {
+        FT_MEM_COPY( out, in, len );
+        in  += pitch;
+        out += pitch;
+
+        FT_MEM_ZERO( out, delta );
+        out += delta;
+      }
+
+      FT_MEM_ZERO( out, new_pitch * ypixels );
     }
 
     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;
+    if ( bitmap->pitch < 0 )
+      bitmap->pitch = -(int)new_pitch;
+    else
+      bitmap->pitch = (int)new_pitch;
 
     return FT_Err_Ok;
   }
      * A gamma of 2.2 is fair to assume.  And then, we need to
      * undo the premultiplication too.
      *
-     *   http://accessibility.kde.org/hsl-adjusted.php
+     *   https://accessibility.kde.org/hsl-adjusted.php
      *
      * We do the computation with integers only, applying a gamma of 2.0.
      * We guarantee 32-bit arithmetic to avoid overflow but the resulting
              (FT_ULong)target->rows > FT_ULONG_MAX / (FT_ULong)target_pitch )
           return FT_THROW( Invalid_Argument );
 
-        if ( target->rows * (FT_ULong)target_pitch > old_size              &&
-             FT_QREALLOC( target->buffer,
+        if ( FT_QREALLOC( target->buffer,
                           old_size, target->rows * (FT_UInt)target_pitch ) )
           return error;
 
index f052550..f4ff45f 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Arithmetic computations (body).                                      */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 #define FT_COMPONENT  trace_calc
 
 
-  /* transfer sign leaving a positive number */
-#define FT_MOVE_SIGN( x, s ) \
-  FT_BEGIN_STMNT             \
-    if ( x < 0 )             \
-    {                        \
-      x = -x;                \
-      s = -s;                \
-    }                        \
+  /* transfer sign, leaving a positive number;                        */
+  /* we need an unsigned value to safely negate INT_MIN (or LONG_MIN) */
+#define FT_MOVE_SIGN( x, x_unsigned, s ) \
+  FT_BEGIN_STMNT                         \
+    if ( x < 0 )                         \
+    {                                    \
+      x_unsigned = 0U - (x_unsigned);    \
+      s          = -s;                   \
+    }                                    \
   FT_END_STMNT
 
   /* The following three functions are available regardless of whether */
@@ -86,7 +87,7 @@
   FT_EXPORT_DEF( FT_Fixed )
   FT_RoundFix( FT_Fixed  a )
   {
-    return ( a + 0x8000L - ( a < 0 ) ) & ~0xFFFFL;
+    return ( ADD_LONG( a, 0x8000L - ( a < 0 ) ) ) & ~0xFFFFL;
   }
 
 
@@ -95,7 +96,7 @@
   FT_EXPORT_DEF( FT_Fixed )
   FT_CeilFix( FT_Fixed  a )
   {
-    return ( a + 0xFFFFL ) & ~0xFFFFL;
+    return ( ADD_LONG( a, 0xFFFFL ) ) & ~0xFFFFL;
   }
 
 
     FT_Long    d_;
 
 
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-    FT_MOVE_SIGN( c_, s );
-
     a = (FT_UInt64)a_;
     b = (FT_UInt64)b_;
     c = (FT_UInt64)c_;
 
+    FT_MOVE_SIGN( a_, a, s );
+    FT_MOVE_SIGN( b_, b, s );
+    FT_MOVE_SIGN( c_, c, s );
+
     d = c > 0 ? ( a * b + ( c >> 1 ) ) / c
               : 0x7FFFFFFFUL;
 
     d_ = (FT_Long)d;
 
-    return s < 0 ? -d_ : d_;
+    return s < 0 ? NEG_LONG( d_ ) : d_;
   }
 
 
     FT_Long    d_;
 
 
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-    FT_MOVE_SIGN( c_, s );
-
     a = (FT_UInt64)a_;
     b = (FT_UInt64)b_;
     c = (FT_UInt64)c_;
 
+    FT_MOVE_SIGN( a_, a, s );
+    FT_MOVE_SIGN( b_, b, s );
+    FT_MOVE_SIGN( c_, c, s );
+
     d = c > 0 ? a * b / c
               : 0x7FFFFFFFUL;
 
     d_ = (FT_Long)d;
 
-    return s < 0 ? -d_ : d_;
+    return s < 0 ? NEG_LONG( d_ ) : d_;
   }
 
 
     FT_Long    q_;
 
 
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-
     a = (FT_UInt64)a_;
     b = (FT_UInt64)b_;
 
+    FT_MOVE_SIGN( a_, a, s );
+    FT_MOVE_SIGN( b_, b, s );
+
     q = b > 0 ? ( ( a << 16 ) + ( b >> 1 ) ) / b
               : 0x7FFFFFFFUL;
 
     q_ = (FT_Long)q;
 
-    return s < 0 ? -q_ : q_;
+    return s < 0 ? NEG_LONG( q_ ) : q_;
   }
 
 
 
     /* XXX: this function does not allow 64-bit arguments */
 
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-    FT_MOVE_SIGN( c_, s );
-
     a = (FT_UInt32)a_;
     b = (FT_UInt32)b_;
     c = (FT_UInt32)c_;
 
+    FT_MOVE_SIGN( a_, a, s );
+    FT_MOVE_SIGN( b_, b, s );
+    FT_MOVE_SIGN( c_, c, s );
+
     if ( c == 0 )
       a = 0x7FFFFFFFUL;
 
 
     a_ = (FT_Long)a;
 
-    return s < 0 ? -a_ : a_;
+    return s < 0 ? NEG_LONG( a_ ) : a_;
   }
 
 
 
     /* XXX: this function does not allow 64-bit arguments */
 
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-    FT_MOVE_SIGN( c_, s );
-
     a = (FT_UInt32)a_;
     b = (FT_UInt32)b_;
     c = (FT_UInt32)c_;
 
+    FT_MOVE_SIGN( a_, a, s );
+    FT_MOVE_SIGN( b_, b, s );
+    FT_MOVE_SIGN( c_, c, s );
+
     if ( c == 0 )
       a = 0x7FFFFFFFUL;
 
 
     a_ = (FT_Long)a;
 
-    return s < 0 ? -a_ : a_;
+    return s < 0 ? NEG_LONG( a_ ) : a_;
   }
 
 
 
     /* XXX: this function does not allow 64-bit arguments */
 
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-
     a = (FT_UInt32)a_;
     b = (FT_UInt32)b_;
 
+    FT_MOVE_SIGN( a_, a, s );
+    FT_MOVE_SIGN( b_, b, s );
+
     if ( a + ( b >> 8 ) <= 8190UL )
       a = ( a * b + 0x8000UL ) >> 16;
     else
 
     a_ = (FT_Long)a;
 
-    return s < 0 ? -a_ : a_;
+    return s < 0 ? NEG_LONG( a_ ) : a_;
 
 #endif /* 0 */
 
 
     /* XXX: this function does not allow 64-bit arguments */
 
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-
     a = (FT_UInt32)a_;
     b = (FT_UInt32)b_;
 
+    FT_MOVE_SIGN( a_, a, s );
+    FT_MOVE_SIGN( b_, b, s );
+
     if ( b == 0 )
     {
       /* check for division by 0 */
 
     q_ = (FT_Long)q;
 
-    return s < 0 ? -q_ : q_;
+    return s < 0 ? NEG_LONG( q_ ) : q_;
   }
 
 
     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;
+    xx = ADD_LONG( FT_MulFix( a->xx, b->xx ),
+                   FT_MulFix( a->xy, b->yx ) );
+    xy = ADD_LONG( FT_MulFix( a->xx, b->xy ),
+                   FT_MulFix( a->xy, b->yy ) );
+    yx = ADD_LONG( FT_MulFix( a->yx, b->xx ),
+                   FT_MulFix( a->yy, b->yx ) );
+    yy = ADD_LONG( FT_MulFix( a->yx, b->xy ),
+                   FT_MulFix( a->yy, b->yy ) );
+
+    b->xx = xx;
+    b->xy = xy;
+    b->yx = yx;
+    b->yy = yy;
   }
 
 
     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;
+    xx = ADD_LONG( FT_MulDiv( a->xx, b->xx, val ),
+                   FT_MulDiv( a->xy, b->yx, val ) );
+    xy = ADD_LONG( FT_MulDiv( a->xx, b->xy, val ),
+                   FT_MulDiv( a->xy, b->yy, val ) );
+    yx = ADD_LONG( FT_MulDiv( a->yx, b->xx, val ),
+                   FT_MulDiv( a->yy, b->yx, val ) );
+    yy = ADD_LONG( 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;
   }
 
 
     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 );
+    xz = ADD_LONG( FT_MulDiv( vector->x, matrix->xx, val ),
+                   FT_MulDiv( vector->y, matrix->xy, val ) );
+    yz = ADD_LONG( FT_MulDiv( vector->x, matrix->yx, val ),
+                   FT_MulDiv( vector->y, matrix->yy, val ) );
 
     vector->x = xz;
     vector->y = yz;
     FT_Int     sx = 1, sy = 1, shift;
 
 
-    FT_MOVE_SIGN( x_, sx );
-    FT_MOVE_SIGN( y_, sy );
-
     x = (FT_UInt32)x_;
     y = (FT_UInt32)y_;
 
+    FT_MOVE_SIGN( x_, x, sx );
+    FT_MOVE_SIGN( y_, y, sy );
+
     /* trivial cases */
     if ( x == 0 )
     {
     FT_Int  result;
 
 
-    if ( (FT_ULong)FT_ABS( in_x ) + (FT_ULong)FT_ABS( out_y ) <= 131071UL &&
-         (FT_ULong)FT_ABS( in_y ) + (FT_ULong)FT_ABS( out_x ) <= 131071UL )
+    /* we silently ignore overflow errors, since such large values */
+    /* lead to even more (harmless) rendering errors later on      */
+    if ( ADD_LONG( FT_ABS( in_x ), FT_ABS( out_y ) ) <= 131071L &&
+         ADD_LONG( FT_ABS( in_y ), FT_ABS( out_x ) ) <= 131071L )
     {
-      FT_Long  z1 = in_x * out_y;
-      FT_Long  z2 = in_y * out_x;
+      FT_Long  z1 = MUL_LONG( in_x, out_y );
+      FT_Long  z2 = MUL_LONG( in_y, out_x );
 
 
       if ( z1 > z2 )
index 398396b..f518464 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing CID font information.                     */
 /*                                                                         */
-/*  Copyright 2007-2017 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  Derek Clegg and Michael Toftdal.                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 242246b..c33d8ac 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Memory debugger (body).                                              */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
     FT_Int       result = 0;
 
 
-    if ( getenv( "FT2_DEBUG_MEMORY" ) )
+    if ( ft_getenv( "FT2_DEBUG_MEMORY" ) )
     {
       table = ft_mem_table_new( memory );
       if ( table )
         memory->realloc = ft_mem_debug_realloc;
         memory->free    = ft_mem_debug_free;
 
-        p = getenv( "FT2_ALLOC_TOTAL_MAX" );
+        p = ft_getenv( "FT2_ALLOC_TOTAL_MAX" );
         if ( p )
         {
           FT_Long  total_max = ft_strtol( p, NULL, 10 );
           }
         }
 
-        p = getenv( "FT2_ALLOC_COUNT_MAX" );
+        p = ft_getenv( "FT2_ALLOC_COUNT_MAX" );
         if ( p )
         {
           FT_Long  total_count = ft_strtol( p, NULL, 10 );
           }
         }
 
-        p = getenv( "FT2_KEEP_ALIVE" );
+        p = ft_getenv( "FT2_KEEP_ALIVE" );
         if ( p )
         {
           FT_Long  keep_alive = ft_strtol( p, NULL, 10 );
index 20c6170..fe26309 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Debugging and logging component (body).                              */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
   FT_BASE_DEF( void )
   ft_debug_init( void )
   {
-    const char*  ft2_debug = getenv( "FT2_DEBUG" );
+    const char*  ft2_debug = ft_getenv( "FT2_DEBUG" );
 
 
     if ( ft2_debug )
index dcbeba0..a2900ce 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType utility file for font formats (body).                       */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index cec4fb3..e6cdf6e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType utility file to access FSType data (body).                  */
 /*                                                                         */
-/*  Copyright 2008-2017 by                                                 */
+/*  Copyright 2008-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 477b725..4f80bba 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Access of TrueType's `gasp' table (body).                            */
 /*                                                                         */
-/*  Copyright 2007-2017 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 8134003..4720249 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType glyph loader (body).                                    */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 9bfb330..6759aa2 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType convenience functions to handle glyphs (body).              */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
       goto Exit;
 
     /* copy advance while converting 26.6 to 16.16 format */
+    if ( slot->advance.x >=  0x8000L * 64 ||
+         slot->advance.x <= -0x8000L * 64 )
+    {
+      FT_ERROR(( "FT_Get_Glyph: advance width too large\n" ));
+      error = FT_THROW( Invalid_Argument );
+      goto Exit2;
+    }
+    if ( slot->advance.y >=  0x8000L * 64 ||
+         slot->advance.y <= -0x8000L * 64 )
+    {
+      FT_ERROR(( "FT_Get_Glyph: advance height too large\n" ));
+      error = FT_THROW( Invalid_Argument );
+      goto Exit2;
+    }
+
     glyph->advance.x = slot->advance.x * 1024;
     glyph->advance.y = slot->advance.y * 1024;
 
     /* now import the image from the glyph slot */
     error = clazz->glyph_init( glyph, slot );
 
+  Exit2:
     /* if an error occurred, destroy the glyph */
     if ( error )
       FT_Done_Glyph( glyph );
index ff24d33..19e2d6a 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for validating TrueTypeGX/AAT tables (body).            */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  Masatake YAMATO, Redhat K.K,                                           */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index b3b08fa..1fa4721 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType initialization layer (body).                                */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 611b39f..5c38911 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for color filtering of subpixel bitmap glyphs (body).   */
 /*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 /* define USE_LEGACY to implement the legacy filter */
 #define  USE_LEGACY
 
+#define FT_SHIFTCLAMP( x )  ( x >>= 8, (FT_Byte)( x > 255 ? 255 : x ) )
+
+
+  /* add padding according to filter weights */
+  FT_BASE_DEF (void)
+  ft_lcd_padding( FT_Pos*       Min,
+                  FT_Pos*       Max,
+                  FT_GlyphSlot  slot )
+  {
+    FT_Byte*                 lcd_weights;
+    FT_Bitmap_LcdFilterFunc  lcd_filter_func;
+
+
+    /* Per-face LCD filtering takes priority if set up. */
+    if ( slot->face && slot->face->internal->lcd_filter_func )
+    {
+      lcd_weights     = slot->face->internal->lcd_weights;
+      lcd_filter_func = slot->face->internal->lcd_filter_func;
+    }
+    else
+    {
+      lcd_weights     = slot->library->lcd_weights;
+      lcd_filter_func = slot->library->lcd_filter_func;
+    }
+
+    if ( lcd_filter_func == ft_lcd_filter_fir )
+    {
+      *Min -= lcd_weights[0] ? 43 :
+              lcd_weights[1] ? 22 : 0;
+      *Max += lcd_weights[4] ? 43 :
+              lcd_weights[3] ? 22 : 0;
+    }
+  }
+
+
   /* FIR filter used by the default and light filters */
-  FT_BASE( void )
+  FT_BASE_DEF( void )
   ft_lcd_filter_fir( FT_Bitmap*           bitmap,
                      FT_Render_Mode       mode,
                      FT_LcdFiveTapFilter  weights )
   {
-    FT_UInt  width   = (FT_UInt)bitmap->width;
-    FT_UInt  height  = (FT_UInt)bitmap->rows;
+    FT_UInt   width  = (FT_UInt)bitmap->width;
+    FT_UInt   height = (FT_UInt)bitmap->rows;
+    FT_Int    pitch  = bitmap->pitch;
+    FT_Byte*  origin = bitmap->buffer;
+
 
+    /* take care of bitmap flow */
+    if ( pitch > 0 )
+      origin += pitch * (FT_Int)( height - 1 );
 
     /* horizontal in-place FIR filter */
-    if ( mode == FT_RENDER_MODE_LCD && width >= 4 )
+    if ( mode == FT_RENDER_MODE_LCD && width >= 2 )
     {
-      FT_Byte*  line = bitmap->buffer;
-
+      FT_Byte*  line = origin;
 
-      /* take care of bitmap flow */
-      if ( bitmap->pitch < 0 )
-        line -= bitmap->pitch * (FT_Int)( bitmap->rows - 1 );
 
-      /* `fir' and `pix' must be at least 32 bit wide, since the sum of */
-      /* the values in `weights' can exceed 0xFF                        */
+      /* `fir' must be at least 32 bit wide, since the sum of */
+      /* the values in `weights' can exceed 0xFF              */
 
-      for ( ; height > 0; height--, line += bitmap->pitch )
+      for ( ; height > 0; height--, line -= pitch )
       {
-        FT_UInt  fir[4];        /* below, `pix' is used as the 5th element */
-        FT_UInt  val1, xx;
+        FT_UInt  fir[5];
+        FT_UInt  val, xx;
 
 
-        val1   = line[0];
-        fir[0] = weights[2] * val1;
-        fir[1] = weights[3] * val1;
-        fir[2] = weights[4] * val1;
-        fir[3] = 0;
+        val    = line[0];
+        fir[2] = weights[2] * val;
+        fir[3] = weights[3] * val;
+        fir[4] = weights[4] * val;
 
-        val1    = line[1];
-        fir[0] += weights[1] * val1;
-        fir[1] += weights[2] * val1;
-        fir[2] += weights[3] * val1;
-        fir[3] += weights[4] * val1;
+        val    = line[1];
+        fir[1] = fir[2] + weights[1] * val;
+        fir[2] = fir[3] + weights[2] * val;
+        fir[3] = fir[4] + weights[3] * val;
+        fir[4] =          weights[4] * val;
 
         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         |= (FT_UInt)-(FT_Int)( pix >> 8 );
-          line[xx - 2] = (FT_Byte)pix;
-        }
-
-        {
-          FT_UInt  pix;
+          fir[0] = fir[1] + weights[0] * val;
+          fir[1] = fir[2] + weights[1] * val;
+          fir[2] = fir[3] + weights[2] * val;
+          fir[3] = fir[4] + weights[3] * val;
+          fir[4] =          weights[4] * val;
 
-
-          pix          = fir[0] >> 8;
-          pix         |= (FT_UInt)-(FT_Int)( pix >> 8 );
-          line[xx - 2] = (FT_Byte)pix;
-
-          pix          = fir[1] >> 8;
-          pix         |= (FT_UInt)-(FT_Int)( pix >> 8 );
-          line[xx - 1] = (FT_Byte)pix;
+          line[xx - 2] = FT_SHIFTCLAMP( fir[0] );
         }
+
+        line[xx - 2] = FT_SHIFTCLAMP( fir[1] );
+        line[xx - 1] = FT_SHIFTCLAMP( fir[2] );
       }
     }
 
     /* vertical in-place FIR filter */
-    else if ( mode == FT_RENDER_MODE_LCD_V && height >= 4 )
+    else if ( mode == FT_RENDER_MODE_LCD_V && height >= 2 )
     {
-      FT_Byte*  column = bitmap->buffer;
-      FT_Int    pitch  = bitmap->pitch;
+      FT_Byte*  column = origin;
 
 
-      /* take care of bitmap flow */
-      if ( bitmap->pitch < 0 )
-        column -= bitmap->pitch * (FT_Int)( bitmap->rows - 1 );
-
       for ( ; width > 0; width--, column++ )
       {
         FT_Byte*  col = column;
-        FT_UInt   fir[4];       /* below, `pix' is used as the 5th element */
-        FT_UInt   val1, yy;
+        FT_UInt   fir[5];
+        FT_UInt   val, yy;
 
 
-        val1   = col[0];
-        fir[0] = weights[2] * val1;
-        fir[1] = weights[3] * val1;
-        fir[2] = weights[4] * val1;
-        fir[3] = 0;
-        col   += pitch;
+        val    = col[0];
+        fir[2] = weights[2] * val;
+        fir[3] = weights[3] * val;
+        fir[4] = weights[4] * val;
+        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;
+        val    = col[0];
+        fir[1] = fir[2] + weights[1] * val;
+        fir[2] = fir[3] + weights[2] * val;
+        fir[3] = fir[4] + weights[3] * val;
+        fir[4] =          weights[4] * val;
+        col   -= pitch;
 
-        for ( yy = 2; yy < height; yy++ )
+        for ( yy = 2; yy < height; yy++, col -= pitch )
         {
-          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            |= (FT_UInt)-(FT_Int)( pix >> 8 );
-          col[-2 * pitch] = (FT_Byte)pix;
-          col            += pitch;
-        }
-
-        {
-          FT_UInt  pix;
-
-
-          pix             = fir[0] >> 8;
-          pix            |= (FT_UInt)-(FT_Int)( pix >> 8 );
-          col[-2 * pitch] = (FT_Byte)pix;
+          fir[0] = fir[1] + weights[0] * val;
+          fir[1] = fir[2] + weights[1] * val;
+          fir[2] = fir[3] + weights[2] * val;
+          fir[3] = fir[4] + weights[3] * val;
+          fir[4] =          weights[4] * val;
 
-          pix         = fir[1] >> 8;
-          pix        |= (FT_UInt)-(FT_Int)( pix >> 8 );
-          col[-pitch] = (FT_Byte)pix;
+          col[pitch * 2]  = FT_SHIFTCLAMP( fir[0] );
         }
+
+        col[pitch * 2]  = FT_SHIFTCLAMP( fir[1] );
+        col[pitch]      = FT_SHIFTCLAMP( fir[2] );
       }
     }
   }
                          FT_Render_Mode  mode,
                          FT_Byte*        weights )
   {
-    FT_UInt  width  = (FT_UInt)bitmap->width;
-    FT_UInt  height = (FT_UInt)bitmap->rows;
-    FT_Int   pitch  = bitmap->pitch;
+    FT_UInt   width  = (FT_UInt)bitmap->width;
+    FT_UInt   height = (FT_UInt)bitmap->rows;
+    FT_Int    pitch  = bitmap->pitch;
+    FT_Byte*  origin = bitmap->buffer;
 
     static const unsigned int  filters[3][3] =
     {
     FT_UNUSED( weights );
 
 
+    /* take care of bitmap flow */
+    if ( pitch > 0 )
+      origin += pitch * (FT_Int)( height - 1 );
+
     /* horizontal in-place intra-pixel filter */
     if ( mode == FT_RENDER_MODE_LCD && width >= 3 )
     {
-      FT_Byte*  line = bitmap->buffer;
-
+      FT_Byte*  line = origin;
 
-      /* take care of bitmap flow */
-      if ( bitmap->pitch < 0 )
-        line -= bitmap->pitch * (FT_Int)( bitmap->rows - 1 );
 
-      for ( ; height > 0; height--, line += pitch )
+      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  r, g, b;
           FT_UInt  p;
 
 
           p  = line[xx];
-          r += filters[0][0] * p;
-          g += filters[0][1] * p;
-          b += filters[0][2] * p;
+          r  = filters[0][0] * p;
+          g  = filters[0][1] * p;
+          b  = filters[0][2] * p;
 
           p  = line[xx + 1];
           r += filters[1][0] * p;
     }
     else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 )
     {
-      FT_Byte*  column = bitmap->buffer;
+      FT_Byte*  column = origin;
 
 
-      /* take care of bitmap flow */
-      if ( bitmap->pitch < 0 )
-        column -= bitmap->pitch * (FT_Int)( bitmap->rows - 1 );
-
       for ( ; width > 0; width--, column++ )
       {
-        FT_Byte*  col     = column;
-        FT_Byte*  col_end = col + (FT_Int)height * pitch;
+        FT_Byte*  col = column - 2 * pitch;
 
 
-        for ( ; col < col_end; col += 3 * pitch )
+        for ( ; height > 0; height -= 3, col -= 3 * pitch )
         {
-          FT_UInt  r = 0;
-          FT_UInt  g = 0;
-          FT_UInt  b = 0;
+          FT_UInt  r, g, b;
           FT_UInt  p;
 
 
           p  = col[0];
-          r += filters[0][0] * p;
-          g += filters[0][1] * p;
-          b += filters[0][2] * p;
+          r  = filters[0][0] * p;
+          g  = filters[0][1] * p;
+          b  = filters[0][2] * p;
 
           p  = col[pitch];
           r += filters[1][0] * p;
 
           col[0]         = (FT_Byte)( r / 65536 );
           col[pitch]     = (FT_Byte)( g / 65536 );
-          col[2 * pitch] = (FT_Byte)( b / 65536 );
+          col[pitch * 2] = (FT_Byte)( b / 65536 );
         }
       }
     }
 
     ft_memcpy( library->lcd_weights, weights, FT_LCD_FILTER_FIVE_TAPS );
     library->lcd_filter_func = ft_lcd_filter_fir;
-    library->lcd_extra       = 2;
 
     return FT_Err_Ok;
   }
     {
     case FT_LCD_FILTER_NONE:
       library->lcd_filter_func = NULL;
-      library->lcd_extra       = 0;
       break;
 
     case FT_LCD_FILTER_DEFAULT:
                  default_weights,
                  FT_LCD_FILTER_FIVE_TAPS );
       library->lcd_filter_func = ft_lcd_filter_fir;
-      library->lcd_extra       = 2;
       break;
 
     case FT_LCD_FILTER_LIGHT:
                  light_weights,
                  FT_LCD_FILTER_FIVE_TAPS );
       library->lcd_filter_func = ft_lcd_filter_fir;
-      library->lcd_extra       = 2;
       break;
 
 #ifdef USE_LEGACY
     case FT_LCD_FILTER_LEGACY:
     case FT_LCD_FILTER_LEGACY1:
       library->lcd_filter_func = _ft_lcd_filter_legacy;
-      library->lcd_extra       = 0;
       break;
 
 #endif
       return FT_THROW( Invalid_Argument );
     }
 
-    library->lcd_filter = filter;
-
     return FT_Err_Ok;
   }
 
 #else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
 
-  FT_BASE( void )
-  ft_lcd_filter_fir( FT_Bitmap*           bitmap,
-                     FT_Render_Mode       mode,
-                     FT_LcdFiveTapFilter  weights )
+  /* add padding according to accommodate outline shifts */
+  FT_BASE_DEF (void)
+  ft_lcd_padding( FT_Pos*       Min,
+                  FT_Pos*       Max,
+                  FT_GlyphSlot  slot )
   {
-    FT_UNUSED( bitmap );
-    FT_UNUSED( mode );
-    FT_UNUSED( weights );
+    FT_UNUSED( slot );
+
+    *Min -= 21;
+    *Max += 21;
   }
 
 
index 4b92066..fd4c0cc 100644 (file)
@@ -8,7 +8,7 @@
 /*  This file is for Mac OS X only; see builds/mac/ftoldmac.c for          */
 /*  classic platforms built by MPW.                                        */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  Just van Rossum, David Turner, Robert Wilhelm, and Werner Lemberg.     */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
   /*    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.   */
+  /* 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,
index 2cb56a3..800441b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Multiple Master font support (body).                                 */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
   /* documentation is in ftmm.h */
 
   FT_EXPORT_DEF( FT_Error )
+  FT_Done_MM_Var( FT_Library  library,
+                  FT_MM_Var*  amaster )
+  {
+    FT_Memory  memory;
+
+
+    if ( !library )
+      return FT_THROW( Invalid_Library_Handle );
+
+    memory = library->memory;
+    FT_FREE( amaster );
+
+    return FT_Err_Ok;
+  }
+
+
+  /* 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 )
 
     /* check of `face' delayed to `ft_face_get_mm_service' */
 
-    if ( !coords )
+    if ( num_coords && !coords )
       return FT_THROW( Invalid_Argument );
 
     error = ft_face_get_mm_service( face, &service );
 
     /* check of `face' delayed to `ft_face_get_mm_service' */
 
-    if ( !coords )
+    if ( num_coords && !coords )
       return FT_THROW( Invalid_Argument );
 
     error = ft_face_get_mm_service( face, &service_mm );
       error = FT_ERR( Invalid_Argument );
       if ( service_mm->set_var_design )
         error = service_mm->set_var_design( face, num_coords, coords );
+
+      /* internal error code -1 means `no change'; we can exit immediately */
+      if ( error == -1 )
+        return FT_Err_Ok;
     }
 
     if ( !error )
 
     /* check of `face' delayed to `ft_face_get_mm_service' */
 
-    if ( !coords )
+    if ( num_coords && !coords )
       return FT_THROW( Invalid_Argument );
 
     error = ft_face_get_mm_service( face, &service_mm );
       error = FT_ERR( Invalid_Argument );
       if ( service_mm->set_mm_blend )
         error = service_mm->set_mm_blend( face, num_coords, coords );
+
+      /* internal error code -1 means `no change'; we can exit immediately */
+      if ( error == -1 )
+        return FT_Err_Ok;
     }
 
     if ( !error )
 
     /* check of `face' delayed to `ft_face_get_mm_service' */
 
-    if ( !coords )
+    if ( num_coords && !coords )
       return FT_THROW( Invalid_Argument );
 
     error = ft_face_get_mm_service( face, &service_mm );
       error = FT_ERR( Invalid_Argument );
       if ( service_mm->set_mm_blend )
         error = service_mm->set_mm_blend( face, num_coords, coords );
+
+      /* internal error code -1 means `no change'; we can exit immediately */
+      if ( error == -1 )
+        return FT_Err_Ok;
     }
 
     if ( !error )
   }
 
 
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Get_Var_Axis_Flags( FT_MM_Var*  master,
+                         FT_UInt     axis_index,
+                         FT_UInt*    flags )
+  {
+    FT_UShort*  axis_flags;
+
+
+    if ( !master || !flags )
+      return FT_THROW( Invalid_Argument );
+
+    if ( axis_index >= master->num_axis )
+      return FT_THROW( Invalid_Argument );
+
+    /* the axis flags array immediately follows the data of `master' */
+    axis_flags = (FT_UShort*)&( master[1] );
+    *flags     = axis_flags[axis_index];
+
+    return FT_Err_Ok;
+  }
+
+
+  /* documentation is in ftmm.h */
+
+  FT_EXPORT_DEF( FT_Error )
+  FT_Set_Named_Instance( FT_Face  face,
+                         FT_UInt  instance_index )
+  {
+    FT_Error  error;
+
+    FT_Service_MultiMasters       service_mm   = NULL;
+    FT_Service_MetricsVariations  service_mvar = NULL;
+
+
+    /* check of `face' delayed to `ft_face_get_mm_service' */
+
+    error = ft_face_get_mm_service( face, &service_mm );
+    if ( !error )
+    {
+      error = FT_ERR( Invalid_Argument );
+      if ( service_mm->set_instance )
+        error = service_mm->set_instance( face, instance_index );
+    }
+
+    if ( !error )
+    {
+      (void)ft_face_get_mvar_service( face, &service_mvar );
+
+      if ( service_mvar && service_mvar->metrics_adjust )
+        service_mvar->metrics_adjust( face );
+    }
+
+    /* enforce recomputation of auto-hinting data */
+    if ( !error && face->autohint.finalizer )
+    {
+      face->autohint.finalizer( face->autohint.data );
+      face->autohint.data = NULL;
+    }
+
+    if ( !error )
+    {
+      face->face_index  = ( instance_index << 16 )        |
+                          ( face->face_index & 0xFFFFL );
+      face->face_flags &= ~FT_FACE_FLAG_VARIATION;
+    }
+
+    return error;
+  }
+
+
 /* END */
index 539116e..8d07e35 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType private base classes (body).                            */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 #include <ft2build.h>
 #include FT_LIST_H
 #include FT_OUTLINE_H
+#include FT_FONT_FORMATS_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_INTERNAL_SFNT_H            /* for SFNT_Load_Table_Func */
+#include FT_INTERNAL_POSTSCRIPT_AUX_H  /* for PS_Driver            */
+
 #include FT_TRUETYPE_TABLES_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_TRUETYPE_IDS_H
@@ -37,8 +41,7 @@
 #include FT_SERVICE_KERNING_H
 #include FT_SERVICE_TRUETYPE_ENGINE_H
 
-#include FT_AUTOHINTER_H
-#include FT_CFF_DRIVER_H
+#include FT_DRIVER_H
 
 #ifdef FT_CONFIG_OPTION_MAC_FONTS
 #include "ftbase.h"
 
 
   FT_BASE_DEF( void )
+  ft_glyphslot_preset_bitmap( FT_GlyphSlot      slot,
+                              FT_Render_Mode    mode,
+                              const FT_Vector*  origin )
+  {
+    FT_Outline*  outline = &slot->outline;
+    FT_Bitmap*   bitmap  = &slot->bitmap;
+
+    FT_Pixel_Mode  pixel_mode;
+
+    FT_BBox  cbox;
+    FT_Pos   x_shift = 0;
+    FT_Pos   y_shift = 0;
+    FT_Pos   x_left, y_top;
+    FT_Pos   width, height, pitch;
+
+
+    if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )
+      return;
+
+    if ( origin )
+    {
+      x_shift = origin->x;
+      y_shift = origin->y;
+    }
+
+    /* compute the control box, and grid-fit it, */
+    /* taking into account the origin shift      */
+    FT_Outline_Get_CBox( outline, &cbox );
+
+    cbox.xMin += x_shift;
+    cbox.yMin += y_shift;
+    cbox.xMax += x_shift;
+    cbox.yMax += y_shift;
+
+    switch ( mode )
+    {
+    case FT_RENDER_MODE_MONO:
+      pixel_mode = FT_PIXEL_MODE_MONO;
+#if 1
+      /* undocumented but confirmed: bbox values get rounded    */
+      /* unless the rounded box can collapse for a narrow glyph */
+      if ( cbox.xMax - cbox.xMin < 64 )
+      {
+        cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
+        cbox.xMax = FT_PIX_CEIL_LONG( cbox.xMax );
+      }
+      else
+      {
+        cbox.xMin = FT_PIX_ROUND_LONG( cbox.xMin );
+        cbox.xMax = FT_PIX_ROUND_LONG( cbox.xMax );
+      }
+
+      if ( cbox.yMax - cbox.yMin < 64 )
+      {
+        cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
+        cbox.yMax = FT_PIX_CEIL_LONG( cbox.yMax );
+      }
+      else
+      {
+        cbox.yMin = FT_PIX_ROUND_LONG( cbox.yMin );
+        cbox.yMax = FT_PIX_ROUND_LONG( cbox.yMax );
+      }
+#else
+      cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
+      cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
+      cbox.xMax = FT_PIX_CEIL_LONG( cbox.xMax );
+      cbox.yMax = FT_PIX_CEIL_LONG( cbox.yMax );
+#endif
+      break;
+
+    case FT_RENDER_MODE_LCD:
+      pixel_mode = FT_PIXEL_MODE_LCD;
+      ft_lcd_padding( &cbox.xMin, &cbox.xMax, slot );
+      goto Round;
+
+    case FT_RENDER_MODE_LCD_V:
+      pixel_mode = FT_PIXEL_MODE_LCD_V;
+      ft_lcd_padding( &cbox.yMin, &cbox.yMax, slot );
+      goto Round;
+
+    case FT_RENDER_MODE_NORMAL:
+    case FT_RENDER_MODE_LIGHT:
+    default:
+      pixel_mode = FT_PIXEL_MODE_GRAY;
+    Round:
+      cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
+      cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
+      cbox.xMax = FT_PIX_CEIL_LONG( cbox.xMax );
+      cbox.yMax = FT_PIX_CEIL_LONG( cbox.yMax );
+    }
+
+    x_shift = SUB_LONG( x_shift, cbox.xMin );
+    y_shift = SUB_LONG( y_shift, cbox.yMin );
+
+    x_left = cbox.xMin >> 6;
+    y_top  = cbox.yMax >> 6;
+
+    width  = ( (FT_ULong)cbox.xMax - (FT_ULong)cbox.xMin ) >> 6;
+    height = ( (FT_ULong)cbox.yMax - (FT_ULong)cbox.yMin ) >> 6;
+
+    switch ( pixel_mode )
+    {
+    case FT_PIXEL_MODE_MONO:
+      pitch = ( ( width + 15 ) >> 4 ) << 1;
+      break;
+
+    case FT_PIXEL_MODE_LCD:
+      width *= 3;
+      pitch  = FT_PAD_CEIL( width, 4 );
+      break;
+
+    case FT_PIXEL_MODE_LCD_V:
+      height *= 3;
+      /* fall through */
+
+    case FT_PIXEL_MODE_GRAY:
+    default:
+      pitch = width;
+    }
+
+    slot->bitmap_left = (FT_Int)x_left;
+    slot->bitmap_top  = (FT_Int)y_top;
+
+    bitmap->pixel_mode = (unsigned char)pixel_mode;
+    bitmap->num_grays  = 256;
+    bitmap->width      = (unsigned int)width;
+    bitmap->rows       = (unsigned int)height;
+    bitmap->pitch      = pitch;
+  }
+
+
+  FT_BASE_DEF( void )
   ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,
                            FT_Byte*      buffer )
   {
     if ( vertical )
     {
       metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );
-      metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );
+      metrics->horiBearingY = FT_PIX_CEIL_LONG( metrics->horiBearingY );
 
-      right  = FT_PIX_CEIL( metrics->vertBearingX + metrics->width );
-      bottom = FT_PIX_CEIL( metrics->vertBearingY + metrics->height );
+      right  = FT_PIX_CEIL_LONG( ADD_LONG( metrics->vertBearingX,
+                                           metrics->width ) );
+      bottom = FT_PIX_CEIL_LONG( ADD_LONG( 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;
+      metrics->width  = SUB_LONG( right,
+                                  metrics->vertBearingX );
+      metrics->height = SUB_LONG( 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 );
+      right  = FT_PIX_CEIL_LONG( ADD_LONG( metrics->horiBearingX,
+                                           metrics->width ) );
+      bottom = FT_PIX_FLOOR( SUB_LONG( metrics->horiBearingY,
+                                       metrics->height ) );
 
       metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );
-      metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );
+      metrics->horiBearingY = FT_PIX_CEIL_LONG( metrics->horiBearingY );
 
-      metrics->width  = right - metrics->horiBearingX;
-      metrics->height = metrics->horiBearingY - bottom;
+      metrics->width  = SUB_LONG( right,
+                                  metrics->horiBearingX );
+      metrics->height = SUB_LONG( metrics->horiBearingY,
+                                  bottom );
     }
 
-    metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance );
-    metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance );
+    metrics->horiAdvance = FT_PIX_ROUND_LONG( metrics->horiAdvance );
+    metrics->vertAdvance = FT_PIX_ROUND_LONG( metrics->vertAdvance );
   }
 #endif /* GRID_FIT_METRICS */
 
      * 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.
+     * - Do only auto-hinting if we have
+     *
+     *   - a hinter module,
+     *   - a scalable font format dealing with outlines,
+     *   - not a tricky font, 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.
       else
       {
         FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );
+        FT_Bool         is_light_type1;
 
 
+        /* only the new Adobe engine (for both CFF and Type 1) is `light'; */
+        /* we use `strstr' to catch both `Type 1' and `CID Type 1'         */
+        is_light_type1 =
+          ft_strstr( FT_Get_Font_Format( face ), "Type 1" ) != NULL   &&
+          ((PS_Driver)driver)->hinting_engine == FT_HINTING_ADOBE;
+
         /* the check for `num_locations' assures that we actually    */
         /* test for instructions in a TTF and not in a CFF-based OTF */
         /*                                                           */
         /* check the size of the `fpgm' and `prep' tables, too --    */
         /* the assumption is that there don't exist real TTFs where  */
         /* both `fpgm' and `prep' tables are missing                 */
-        if ( ( mode == FT_RENDER_MODE_LIGHT       &&
-               !FT_DRIVER_HINTS_LIGHTLY( driver ) )             ||
+        if ( ( mode == FT_RENDER_MODE_LIGHT           &&
+               ( !FT_DRIVER_HINTS_LIGHTLY( driver ) &&
+                 !is_light_type1                    ) )         ||
              ( FT_IS_SFNT( face )                             &&
                ttface->num_locations                          &&
                ttface->max_profile.maxSizeOfInstructions == 0 &&
       /* 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 )
+      if ( FT_HAS_FIXED_SIZES( face )              &&
+           ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
       {
         error = driver->clazz->load_glyph( slot, face->size,
                                            glyph_index,
 
     /* compute the linear advance in 16.16 pixels */
     if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 &&
-         ( FT_IS_SCALABLE( face ) )                  )
+         FT_IS_SCALABLE( face )                      )
     {
       FT_Size_Metrics*  metrics = &face->size->metrics;
 
       }
     }
 
-    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? */
+    /* do we need to render the image or preset the bitmap now? */
     if ( !error                                    &&
+         ( load_flags & FT_LOAD_NO_SCALE ) == 0    &&
          slot->format != FT_GLYPH_FORMAT_BITMAP    &&
-         slot->format != FT_GLYPH_FORMAT_COMPOSITE &&
-         load_flags & FT_LOAD_RENDER )
+         slot->format != FT_GLYPH_FORMAT_COMPOSITE )
     {
       FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );
 
 
-      if ( mode == FT_RENDER_MODE_NORMAL      &&
-           (load_flags & FT_LOAD_MONOCHROME ) )
+      if ( mode == FT_RENDER_MODE_NORMAL   &&
+           load_flags & FT_LOAD_MONOCHROME )
         mode = FT_RENDER_MODE_MONO;
 
-      error = FT_Render_Glyph( slot, mode );
+      if ( load_flags & FT_LOAD_RENDER )
+        error = FT_Render_Glyph( slot, mode );
+      else
+        ft_glyphslot_preset_bitmap( slot, mode, NULL );
     }
 
+    FT_TRACE5(( "FT_Load_Glyph: index %d, flags %x\n",
+                glyph_index, load_flags               ));
+    FT_TRACE5(( "  x advance: %f\n", slot->advance.x / 64.0 ));
+    FT_TRACE5(( "  y advance: %f\n", slot->advance.y / 64.0 ));
+    FT_TRACE5(( "  linear x advance: %f\n",
+                slot->linearHoriAdvance / 65536.0 ));
+    FT_TRACE5(( "  linear y advance: %f\n",
+                slot->linearVertAdvance / 65536.0 ));
+    FT_TRACE5(( "  bitmap %dx%d, mode %d\n",
+                slot->bitmap.width, slot->bitmap.rows,
+                slot->bitmap.pixel_mode               ));
+
   Exit:
     return error;
   }
       internal->no_stem_darkening = -1;
 
 #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-      ft_memset( internal->lcd_weights, 0, FT_LCD_FILTER_FIVE_TAPS );
+      /* Per-face filtering can only be set up by FT_Face_Properties */
+      internal->lcd_filter_func = NULL;
 #endif
     }
 
       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 ));
   }
 
 
       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 ));
   }
 
 
   FT_Select_Size( FT_Face  face,
                   FT_Int   strike_index )
   {
+    FT_Error         error = FT_Err_Ok;
     FT_Driver_Class  clazz;
 
 
 
     if ( clazz->select_size )
     {
-      FT_Error  error;
+      error = clazz->select_size( face->size, (FT_ULong)strike_index );
 
+      FT_TRACE5(( "FT_Select_Size (%s driver):\n",
+                  face->driver->root.clazz->module_name ));
+    }
+    else
+    {
+      FT_Select_Metrics( face, (FT_ULong)strike_index );
 
-      error = clazz->select_size( face->size, (FT_ULong)strike_index );
+      FT_TRACE5(( "FT_Select_Size:\n" ));
+    }
 
 #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
+    {
+      FT_Size_Metrics*  metrics = &face->size->metrics;
 
-      return error;
-    }
 
-    FT_Select_Metrics( face, (FT_ULong)strike_index );
+      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 FT_Err_Ok;
+    return error;
   }
 
 
   FT_Request_Size( FT_Face          face,
                    FT_Size_Request  req )
   {
+    FT_Error         error = FT_Err_Ok;
     FT_Driver_Class  clazz;
     FT_ULong         strike_index;
 
 
     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;
+      FT_TRACE5(( "FT_Request_Size (%s driver):\n",
+                  face->driver->root.clazz->module_name ));
     }
-
-    /*
-     * 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 ) )
+    else if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) )
     {
-      FT_Error  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.
+       */
       error = FT_Match_Size( face, req, 0, &strike_index );
       if ( error )
         return error;
 
       return FT_Select_Size( face, (FT_Int)strike_index );
     }
+    else
+    {
+      FT_Request_Metrics( face, req );
 
-    FT_Request_Metrics( face, req );
+      FT_TRACE5(( "FT_Request_Size:\n" ));
+    }
 
-    return FT_Err_Ok;
+#ifdef FT_DEBUG_LEVEL_TRACE
+    {
+      FT_Size_Metrics*  metrics = &face->size->metrics;
+
+
+      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;
   }
 
 
       {
 #ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
         if ( properties->data )
+        {
           ft_memcpy( face->internal->lcd_weights,
                      properties->data,
                      FT_LCD_FILTER_FIVE_TAPS );
-        else
-        {
-          /* Value NULL indicates `no custom weights, use library        */
-          /* defaults', signaled by filling the weight field with zeros. */
-          ft_memset( face->internal->lcd_weights,
-                     0,
-                     FT_LCD_FILTER_FIVE_TAPS );
+          face->internal->lcd_filter_func = ft_lcd_filter_fir;
         }
 #else
         error = FT_THROW( Unimplemented_Feature );
      */
 
     /* we use FT_TRACE3 in this block */
-    if ( ft_trace_levels[trace_bitmap] >= 3 )
+    if ( !error                             &&
+         ft_trace_levels[trace_bitmap] >= 3 &&
+         slot->bitmap.buffer                )
     {
+      FT_Bitmap  bitmap;
+      FT_Error   err;
+
+
+      FT_Bitmap_Init( &bitmap );
+
       /* we convert to a single bitmap format for computing the checksum */
-      if ( !error && slot->bitmap.buffer )
+      /* this also converts the bitmap flow to `down' (i.e., pitch > 0)  */
+      err = FT_Bitmap_Convert( library, &slot->bitmap, &bitmap, 1 );
+      if ( !err )
       {
-        FT_Bitmap  bitmap;
-        FT_Error   err;
+        MD5_CTX        ctx;
+        unsigned char  md5[16];
+        unsigned long  coverage = 0;
+        int            i, j;
+        int            rows  = (int)bitmap.rows;
+        int            pitch = bitmap.pitch;
 
 
-        FT_Bitmap_Init( &bitmap );
+        FT_TRACE3(( "FT_Render_Glyph: bitmap %dx%d, mode %d\n",
+                    rows, pitch, slot->bitmap.pixel_mode ));
 
-        /* this also converts the bitmap flow to `down' (i.e., pitch > 0) */
-        err = FT_Bitmap_Convert( library, &slot->bitmap, &bitmap, 1 );
-        if ( !err )
+        for ( i = 0; i < rows; i++ )
+          for ( j = 0; j < pitch; j++ )
+            coverage += bitmap.buffer[i * pitch + j];
+
+        FT_TRACE3(( "  Total coverage: %lu\n", coverage ));
+
+        MD5_Init( &ctx );
+        if ( bitmap.buffer )
+          MD5_Update( &ctx, bitmap.buffer,
+                      (unsigned long)rows * (unsigned long)pitch );
+        MD5_Final( md5, &ctx );
+
+        FT_TRACE3(( "  MD5 checksum: " ));
+        for ( i = 0; i < 16; i++ )
+          FT_TRACE3(( "%02X", md5[i] ));
+        FT_TRACE3(( "\n" ));
+      }
+
+      FT_Bitmap_Done( library, &bitmap );
+    }
+
+    /*
+     * Dump bitmap in Netpbm format (PBM or PGM).
+     */
+
+    /* we use FT_TRACE7 in this block */
+    if ( !error                             &&
+         ft_trace_levels[trace_bitmap] >= 7 &&
+         slot->bitmap.rows  < 128U          &&
+         slot->bitmap.width < 128U          &&
+         slot->bitmap.buffer                )
+    {
+      int  rows  = (int)slot->bitmap.rows;
+      int  width = (int)slot->bitmap.width;
+      int  pitch =      slot->bitmap.pitch;
+      int  i, j, m;
+      unsigned char*  topleft = slot->bitmap.buffer;
+
+      if ( pitch < 0 )
+        topleft -= pitch * ( rows - 1 );
+
+      FT_TRACE7(( "Netpbm image: start\n" ));
+      switch ( slot->bitmap.pixel_mode )
+      {
+      case FT_PIXEL_MODE_MONO:
+        FT_TRACE7(( "P1 %d %d\n", width, rows ));
+        for ( i = 0; i < rows; i++ )
         {
-          MD5_CTX        ctx;
-          unsigned char  md5[16];
-          int            i;
-          unsigned int   rows  = bitmap.rows;
-          unsigned int   pitch = (unsigned int)bitmap.pitch;
-
-
-          MD5_Init( &ctx );
-          if ( bitmap.buffer )
-            MD5_Update( &ctx, bitmap.buffer, rows * pitch );
-          MD5_Final( md5, &ctx );
-
-          FT_TRACE3(( "MD5 checksum for %dx%d bitmap:\n"
-                      "  ",
-                      rows, pitch ));
-          for ( i = 0; i < 16; i++ )
-            FT_TRACE3(( "%02X", md5[i] ));
-          FT_TRACE3(( "\n" ));
+          for ( j = 0; j < width; )
+            for ( m = 128; m > 0 && j < width; m >>= 1, j++ )
+              FT_TRACE7(( " %d", ( topleft[i * pitch + j / 8] & m ) != 0 ));
+          FT_TRACE7(( "\n" ));
         }
+        break;
 
-        FT_Bitmap_Done( library, &bitmap );
+      default:
+        FT_TRACE7(( "P2 %d %d 255\n", width, rows ));
+        for ( i = 0; i < rows; i++ )
+        {
+          for ( j = 0; j < width; j += 1 )
+            FT_TRACE7(( " %3u", topleft[i * pitch + j] ));
+          FT_TRACE7(( "\n" ));
+        }
       }
+      FT_TRACE7(( "Netpbm image: end\n" ));
     }
 
 #undef  FT_COMPONENT
     if ( !clazz )
       return FT_THROW( Invalid_Argument );
 
-    /* check freetype version */
+    /* check FreeType version */
     if ( clazz->module_requires > FREETYPE_VER_FIXED )
       return FT_THROW( Invalid_Version );
 
       goto Fail;
 #endif
 
-    /* we don't use raster_pool anymore. */
-    library->raster_pool_size = 0;
-    library->raster_pool      = NULL;
-
     library->version_major = FREETYPE_MAJOR;
     library->version_minor = FREETYPE_MINOR;
     library->version_patch = FREETYPE_PATCH;
 #ifdef FT_CONFIG_OPTION_PIC
   Fail:
     ft_pic_container_destroy( library );
-#endif
     FT_FREE( library );
     return error;
+#endif
   }
 
 
index 5fa0986..a2944a7 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for validating OpenType tables (body).                  */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 464a066..9c29ade 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType outline management (body).                                  */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 
     for ( n = 0; n < outline->n_points; n++ )
     {
-      vec->x += xOffset;
-      vec->y += yOffset;
+      vec->x = ADD_LONG( vec->x, xOffset );
+      vec->y = ADD_LONG( vec->y, yOffset );
       vec++;
     }
   }
         v_cur.x = points[n].x >> xshift;
         v_cur.y = points[n].y >> yshift;
 
-        area += ( v_cur.y - v_prev.y ) * ( v_cur.x + v_prev.x );
+        area = ADD_LONG( area,
+                         ( v_cur.y - v_prev.y ) * ( v_cur.x + v_prev.x ) );
 
         v_prev = v_cur;
       }
index 9900f99..e23ee2e 100644 (file)
@@ -5,7 +5,7 @@
 /*    FreeType API for checking patented TrueType bytecode instructions    */
 /*    (body).  Obsolete, retained for backward compatibility.              */
 /*                                                                         */
-/*  Copyright 2007-2017 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  David Turner.                                                          */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 5cc0b70..bfe1352 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing PFR-specific data (body).                 */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 0f84fdd..1492e18 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services (body).              */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/base/ftpsprop.c b/src/base/ftpsprop.c
new file mode 100644 (file)
index 0000000..459b5e6
--- /dev/null
@@ -0,0 +1,285 @@
+/***************************************************************************/
+/*                                                                         */
+/*  ftpsprop.c                                                             */
+/*                                                                         */
+/*    Get and set properties of PostScript drivers (body).                 */
+/*    See `ftdriver.h' for available properties.                           */
+/*                                                                         */
+/*  Copyright 2017-2018 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.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_DRIVER_H
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_OBJECTS_H
+#include FT_INTERNAL_POSTSCRIPT_PROPS_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_psprops
+
+
+  FT_BASE_CALLBACK_DEF( FT_Error )
+  ps_property_set( FT_Module    module,         /* PS_Driver */
+                   const char*  property_name,
+                   const void*  value,
+                   FT_Bool      value_is_string )
+  {
+    FT_Error   error  = FT_Err_Ok;
+    PS_Driver  driver = (PS_Driver)module;
+
+#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+    FT_UNUSED( value_is_string );
+#endif
+
+
+    if ( !ft_strcmp( property_name, "darkening-parameters" ) )
+    {
+      FT_Int*  darken_params;
+      FT_Int   x1, y1, x2, y2, x3, y3, x4, y4;
+
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      FT_Int   dp[8];
+
+
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+        char*        ep;
+        int          i;
+
+
+        /* eight comma-separated numbers */
+        for ( i = 0; i < 7; i++ )
+        {
+          dp[i] = (FT_Int)ft_strtol( s, &ep, 10 );
+          if ( *ep != ',' || s == ep )
+            return FT_THROW( Invalid_Argument );
+
+          s = ep + 1;
+        }
+
+        dp[7] = (FT_Int)ft_strtol( s, &ep, 10 );
+        if ( !( *ep == '\0' || *ep == ' ' ) || s == ep )
+          return FT_THROW( Invalid_Argument );
+
+        darken_params = dp;
+      }
+      else
+#endif
+        darken_params = (FT_Int*)value;
+
+      x1 = darken_params[0];
+      y1 = darken_params[1];
+      x2 = darken_params[2];
+      y2 = darken_params[3];
+      x3 = darken_params[4];
+      y3 = darken_params[5];
+      x4 = darken_params[6];
+      y4 = darken_params[7];
+
+      if ( x1 < 0   || x2 < 0   || x3 < 0   || x4 < 0   ||
+           y1 < 0   || y2 < 0   || y3 < 0   || y4 < 0   ||
+           x1 > x2  || x2 > x3  || x3 > x4              ||
+           y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 )
+        return FT_THROW( Invalid_Argument );
+
+      driver->darken_params[0] = x1;
+      driver->darken_params[1] = y1;
+      driver->darken_params[2] = x2;
+      driver->darken_params[3] = y2;
+      driver->darken_params[4] = x3;
+      driver->darken_params[5] = y3;
+      driver->darken_params[6] = x4;
+      driver->darken_params[7] = y4;
+
+      return error;
+    }
+
+    else if ( !ft_strcmp( property_name, "hinting-engine" ) )
+    {
+#if defined( CFF_CONFIG_OPTION_OLD_ENGINE ) || \
+    defined( T1_CONFIG_OPTION_OLD_ENGINE  )
+      const char*  module_name = module->clazz->module_name;
+#endif
+
+
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+
+
+        if ( !ft_strcmp( s, "adobe" ) )
+          driver->hinting_engine = FT_HINTING_ADOBE;
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+        else if ( !ft_strcmp( module_name, "cff" ) &&
+                  !ft_strcmp( s, "freetype" )      )
+          driver->hinting_engine = FT_HINTING_FREETYPE;
+#endif
+
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+        else if ( ( !ft_strcmp( module_name, "type1" ) ||
+                    !ft_strcmp( module_name, "t1cid" ) ) &&
+                  !ft_strcmp( s, "freetype" )            )
+          driver->hinting_engine = FT_HINTING_FREETYPE;
+#endif
+
+        else
+          return FT_THROW( Invalid_Argument );
+      }
+      else
+#endif /* FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES */
+      {
+        FT_UInt*  hinting_engine = (FT_UInt*)value;
+
+
+        if ( *hinting_engine == FT_HINTING_ADOBE
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+             || ( *hinting_engine == FT_HINTING_FREETYPE &&
+                  !ft_strcmp( module_name, "cff" )       )
+#endif
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+             || ( *hinting_engine == FT_HINTING_FREETYPE &&
+                  ( !ft_strcmp( module_name, "type1" ) ||
+                    !ft_strcmp( module_name, "t1cid" ) ) )
+#endif
+           )
+          driver->hinting_engine = *hinting_engine;
+        else
+          error = FT_ERR( Unimplemented_Feature );
+
+        return error;
+      }
+    }
+
+    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+    {
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s   = (const char*)value;
+        long         nsd = ft_strtol( s, NULL, 10 );
+
+
+        if ( !nsd )
+          driver->no_stem_darkening = FALSE;
+        else
+          driver->no_stem_darkening = TRUE;
+      }
+      else
+#endif
+      {
+        FT_Bool*  no_stem_darkening = (FT_Bool*)value;
+
+
+        driver->no_stem_darkening = *no_stem_darkening;
+      }
+
+      return error;
+    }
+
+    else if ( !ft_strcmp( property_name, "random-seed" ) )
+    {
+      FT_Int32  random_seed;
+
+
+#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
+      if ( value_is_string )
+      {
+        const char*  s = (const char*)value;
+
+
+        random_seed = (FT_Int32)ft_strtol( s, NULL, 10 );
+      }
+      else
+#endif
+        random_seed = *(FT_Int32*)value;
+
+      if ( random_seed < 0 )
+        random_seed = 0;
+
+      driver->random_seed = random_seed;
+
+      return error;
+    }
+
+    FT_TRACE0(( "ps_property_set: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+  FT_BASE_CALLBACK_DEF( FT_Error )
+  ps_property_get( FT_Module    module,         /* PS_Driver */
+                   const char*  property_name,
+                   void*        value )
+  {
+    FT_Error   error  = FT_Err_Ok;
+    PS_Driver  driver = (PS_Driver)module;
+
+
+    if ( !ft_strcmp( property_name, "darkening-parameters" ) )
+    {
+      FT_Int*  darken_params = driver->darken_params;
+      FT_Int*  val           = (FT_Int*)value;
+
+
+      val[0] = darken_params[0];
+      val[1] = darken_params[1];
+      val[2] = darken_params[2];
+      val[3] = darken_params[3];
+      val[4] = darken_params[4];
+      val[5] = darken_params[5];
+      val[6] = darken_params[6];
+      val[7] = darken_params[7];
+
+      return error;
+    }
+
+    else if ( !ft_strcmp( property_name, "hinting-engine" ) )
+    {
+      FT_UInt   hinting_engine    = driver->hinting_engine;
+      FT_UInt*  val               = (FT_UInt*)value;
+
+
+      *val = hinting_engine;
+
+      return error;
+    }
+
+    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
+    {
+      FT_Bool   no_stem_darkening = driver->no_stem_darkening;
+      FT_Bool*  val               = (FT_Bool*)value;
+
+
+      *val = no_stem_darkening;
+
+      return error;
+    }
+
+    FT_TRACE0(( "ps_property_get: missing property `%s'\n",
+                property_name ));
+    return FT_THROW( Missing_Property );
+  }
+
+
+/* END */
index f7b8137..c3a2b91 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Embedded resource forks accessor (body).                             */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  Masatake YAMATO and Redhat K.K.                                        */
 /*                                                                         */
 /*  FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are     */
           if ( FT_STREAM_SKIP( 4 ) )  /* mbz */
             goto Exit;
 
-          if ( ref[j].res_id < 0 || temp < 0 )
+          /*
+           * According to Inside Macintosh: More Macintosh Toolbox,
+           * "Resource IDs" (1-46), there are some reserved IDs.
+           * However, FreeType2 is not a font synthesizer, no need
+           * to check the acceptable resource ID.
+           */
+          if ( temp < 0 )
           {
             error = FT_THROW( Invalid_Table );
             goto Exit;
 
           FT_TRACE3(( "             [%d]:"
                       " resource_id=0x%04x, offset=0x%08x\n",
-                      j, ref[j].res_id, ref[j].offset ));
+                      j, (FT_UShort)ref[j].res_id, ref[j].offset ));
         }
 
         if ( sort_by_res_id )
   }
 
 
-#ifndef FT_MACINTOSH
+#if defined( FT_CONFIG_OPTION_MAC_FONTS ) && !defined( FT_MACINTOSH )
   static FT_RFork_Rule
   raccess_get_rule_type_from_rule_index( FT_Library  library,
                                          FT_UInt     rule_index )
index 3609450..90ea1e2 100644 (file)
@@ -7,7 +7,7 @@
 /*                                                                         */
 /*    This is _not_ used to retrieve glyph names!                          */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index a3f8c8b..18df7dc 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    I/O stream support (body).                                           */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index d32de0d..6ae1819 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType path stroker (body).                                        */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 66dae60..c283467 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType synthesizing code for emboldening and slanting (body).      */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 
       /*
        * XXX: overflow check for 16-bit system, for compatibility
-       *      with FT_GlyphSlot_Embolden() since freetype-2.1.10.
+       *      with FT_GlyphSlot_Embolden() since FreeType 2.1.10.
        *      unfortunately, this function return no informations
        *      about the cause of error.
        */
index 324f949..6adebdb 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    ANSI-specific FreeType low-level system interface (body).            */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 7a4d17c..d6dd098 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType trigonometric functions (body).                             */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 4d16a63..aa8f8cc 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType utility file for PS names support (body).                   */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index dccc209..4de5f2c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType utility file for memory and list management (body).         */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
       ft_mem_free( memory, block );
       block = NULL;
     }
-    else if ( new_count > FT_INT_MAX/item_size )
+    else if ( new_count > FT_INT_MAX / item_size )
     {
       error = FT_THROW( Array_Too_Large );
     }
     {
       FT_ASSERT( !block );
 
-      block = ft_mem_alloc( memory, new_count*item_size, &error );
+      block = memory->alloc( memory, new_count * item_size );
+      if ( block == NULL )
+        error = FT_THROW( Out_Of_Memory );
     }
     else
     {
       FT_Pointer  block2;
-      FT_Long     cur_size = cur_count*item_size;
-      FT_Long     new_size = new_count*item_size;
+      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 );
index 05baa02..11bd28a 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType API for accessing Windows FNT specific info (body).         */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 2a1e93c..6491f5d 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -45,6 +45,7 @@ BASE_SRC := $(BASE_DIR)/basepic.c  \
             $(BASE_DIR)/ftobjs.c   \
             $(BASE_DIR)/ftoutln.c  \
             $(BASE_DIR)/ftpic.c    \
+            $(BASE_DIR)/ftpsprop.c \
             $(BASE_DIR)/ftrfork.c  \
             $(BASE_DIR)/ftsnames.c \
             $(BASE_DIR)/ftstream.c \
index f382b51..d9e441c 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/bdf Jamfile
 #
-# Copyright 2002-2017 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index b761aba..996ac2d 100644 (file)
@@ -13,7 +13,7 @@ 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
+  https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/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
index a2242be..ca937f8 100644 (file)
@@ -373,7 +373,7 @@ THE SOFTWARE.
     /* we have a bdf font: let's construct the face object */
     face->bdffont = font;
 
-    /* BDF could not have multiple face in single font file.
+    /* BDF cannot have multiple faces in a single font file.
      * XXX: non-zero face_index is already invalid argument, but
      *      Type1, Type42 driver has a convention to return
      *      an invalid argument error when the font could be
@@ -437,46 +437,156 @@ THE SOFTWARE.
       {
         FT_Bitmap_Size*  bsize = bdfface->available_sizes;
         FT_Short         resolution_x = 0, resolution_y = 0;
+        long             value;
 
 
         FT_ZERO( bsize );
 
+        /* sanity checks */
+        if ( font->font_ascent > 0x7FFF || font->font_ascent < -0x7FFF )
+        {
+          font->font_ascent = font->font_ascent < 0 ? -0x7FFF : 0x7FFF;
+          FT_TRACE0(( "BDF_Face_Init: clamping font ascent to value %d\n",
+                      font->font_ascent ));
+        }
+        if ( font->font_descent > 0x7FFF || font->font_descent < -0x7FFF )
+        {
+          font->font_descent = font->font_descent < 0 ? -0x7FFF : 0x7FFF;
+          FT_TRACE0(( "BDF_Face_Init: clamping font descent to value %d\n",
+                      font->font_descent ));
+        }
+
         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 );
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( prop->value.l < 0 )
+            FT_TRACE0(( "BDF_Face_Init: negative average width\n" ));
+#endif
+          if ( prop->value.l >    0x7FFFL * 10 - 5   ||
+               prop->value.l < -( 0x7FFFL * 10 - 5 ) )
+          {
+            bsize->width = 0x7FFF;
+            FT_TRACE0(( "BDF_Face_Init: clamping average width to value %d\n",
+                        bsize->width ));
+          }
+          else
+            bsize->width = FT_ABS( (FT_Short)( ( prop->value.l + 5 ) / 10 ) );
+        }
         else
-          bsize->width = (FT_Short)( bsize->height * 2/3 );
+        {
+          /* this is a heuristical value */
+          bsize->width = (FT_Short)FT_MulDiv( bsize->height, 2, 3 );
+        }
 
         prop = bdf_get_font_property( font, "POINT_SIZE" );
         if ( prop )
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( prop->value.l < 0 )
+            FT_TRACE0(( "BDF_Face_Init: negative point size\n" ));
+#endif
           /* convert from 722.7 decipoints to 72 points per inch */
-          bsize->size =
-            (FT_Pos)( ( prop->value.l * 64 * 7200 + 36135L ) / 72270L );
+          if ( prop->value.l >  0x504C2L || /* 0x7FFF * 72270/7200 */
+               prop->value.l < -0x504C2L )
+          {
+            bsize->size = 0x7FFF;
+            FT_TRACE0(( "BDF_Face_Init: clamping point size to value %d\n",
+                        bsize->size ));
+          }
+          else
+            bsize->size = FT_MulDiv( FT_ABS( prop->value.l ),
+                                     64 * 7200,
+                                     72270L );
+        }
+        else if ( font->point_size )
+        {
+          if ( font->point_size > 0x7FFF )
+          {
+            bsize->size = 0x7FFF;
+            FT_TRACE0(( "BDF_Face_Init: clamping point size to value %d\n",
+                        bsize->size ));
+          }
+          else
+            bsize->size = (FT_Pos)font->point_size << 6;
+        }
         else
-          bsize->size = bsize->width << 6;
+        {
+          /* this is a heuristical value */
+          bsize->size = bsize->width * 64;
+        }
 
         prop = bdf_get_font_property( font, "PIXEL_SIZE" );
         if ( prop )
-          bsize->y_ppem = (FT_Short)prop->value.l << 6;
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( prop->value.l < 0 )
+            FT_TRACE0(( "BDF_Face_Init: negative pixel size\n" ));
+#endif
+          if ( prop->value.l > 0x7FFF || prop->value.l < -0x7FFF )
+          {
+            bsize->y_ppem = 0x7FFF << 6;
+            FT_TRACE0(( "BDF_Face_Init: clamping pixel size to value %d\n",
+                        bsize->y_ppem ));
+          }
+          else
+            bsize->y_ppem = FT_ABS( (FT_Short)prop->value.l ) << 6;
+        }
 
         prop = bdf_get_font_property( font, "RESOLUTION_X" );
         if ( prop )
-          resolution_x = (FT_Short)prop->value.l;
+          value = prop->value.l;
+        else
+          value = (long)font->resolution_x;
+        if ( value )
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( value < 0 )
+            FT_TRACE0(( "BDF_Face_Init: negative X resolution\n" ));
+#endif
+          if ( value > 0x7FFF || value < -0x7FFF )
+          {
+            resolution_x = 0x7FFF;
+            FT_TRACE0(( "BDF_Face_Init: clamping X resolution to value %d\n",
+                        resolution_x ));
+          }
+          else
+            resolution_x = FT_ABS( (FT_Short)value );
+        }
 
         prop = bdf_get_font_property( font, "RESOLUTION_Y" );
         if ( prop )
-          resolution_y = (FT_Short)prop->value.l;
+          value = prop->value.l;
+        else
+          value = (long)font->resolution_y;
+        if ( value )
+        {
+#ifdef FT_DEBUG_LEVEL_TRACE
+          if ( value < 0 )
+            FT_TRACE0(( "BDF_Face_Init: negative Y resolution\n" ));
+#endif
+          if ( value > 0x7FFF || value < -0x7FFF )
+          {
+            resolution_y = 0x7FFF;
+            FT_TRACE0(( "BDF_Face_Init: clamping Y resolution to value %d\n",
+                        resolution_y ));
+          }
+          else
+            resolution_y = FT_ABS( (FT_Short)value );
+        }
 
         if ( bsize->y_ppem == 0 )
         {
           bsize->y_ppem = bsize->size;
           if ( resolution_y )
-            bsize->y_ppem = bsize->y_ppem * resolution_y / 72;
+            bsize->y_ppem = FT_MulDiv( bsize->y_ppem, resolution_y, 72 );
         }
         if ( resolution_x && resolution_y )
-          bsize->x_ppem = bsize->y_ppem * resolution_x / resolution_y;
+          bsize->x_ppem = FT_MulDiv( bsize->y_ppem,
+                                     resolution_x,
+                                     resolution_y );
         else
           bsize->x_ppem = bsize->y_ppem;
       }
@@ -545,7 +655,11 @@ THE SOFTWARE.
               if ( !ft_strcmp( s, "10646" )                      ||
                    ( !ft_strcmp( s, "8859" ) &&
                      !ft_strcmp( face->charset_encoding, "1" ) ) )
-              unicode_charmap = 1;
+                unicode_charmap = 1;
+              /* another name for ASCII */
+              else if ( !ft_strcmp( s, "646.1991" )                 &&
+                        !ft_strcmp( face->charset_encoding, "IRV" ) )
+                unicode_charmap = 1;
             }
 
             {
@@ -566,12 +680,6 @@ THE SOFTWARE.
               }
 
               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;
@@ -705,7 +813,7 @@ THE SOFTWARE.
 
     bitmap->rows  = glyph.bbx.height;
     bitmap->width = glyph.bbx.width;
-    if ( glyph.bpr > INT_MAX )
+    if ( glyph.bpr > FT_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 */
index 7fd95a7..2f5c99d 100644 (file)
       return 0;
 
     for ( v = 0; sbitset( ddigits, *s ); s++ )
-      v = v * 10 + a2i[(int)*s];
+    {
+      if ( v < ( FT_ULONG_MAX - 9 ) / 10 )
+        v = v * 10 + a2i[(int)*s];
+      else
+      {
+        v = FT_ULONG_MAX;
+        break;
+      }
+    }
 
     return v;
   }
     }
 
     for ( v = 0; sbitset( ddigits, *s ); s++ )
-      v = v * 10 + a2i[(int)*s];
+    {
+      if ( v < ( FT_LONG_MAX - 9 ) / 10 )
+        v = v * 10 + a2i[(int)*s];
+      else
+      {
+        v = FT_LONG_MAX;
+        break;
+      }
+    }
 
     return ( !neg ) ? v : -v;
   }
       return 0;
 
     for ( v = 0; sbitset( ddigits, *s ); s++ )
-      v = (unsigned short)( v * 10 + a2i[(int)*s] );
+    {
+      if ( v < ( FT_USHORT_MAX - 9 ) / 10 )
+        v = (unsigned short)( v * 10 + a2i[(int)*s] );
+      else
+      {
+        v = FT_USHORT_MAX;
+        break;
+      }
+    }
 
     return v;
   }
     }
 
     for ( v = 0; sbitset( ddigits, *s ); s++ )
-      v = (short)( v * 10 + a2i[(int)*s] );
+    {
+      if ( v < ( SHRT_MAX - 9 ) / 10 )
+        v = (short)( v * 10 + a2i[(int)*s] );
+      else
+      {
+        v = SHRT_MAX;
+        break;
+      }
+    }
 
     return (short)( ( !neg ) ? v : -v );
   }
index f369d4a..3548eab 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/bzip2 Jamfile
 #
-# Copyright 2010-2017 by
+# Copyright 2010-2018 by
 # Joel Klinghed
 #
 # based on `src/lzw/Jamfile'
index 7fc71e7..1601948 100644 (file)
@@ -8,7 +8,7 @@
 /*  parse compressed PCF fonts, as found with many X11 server              */
 /*  distributions.                                                         */
 /*                                                                         */
-/*  Copyright 2010-2017 by                                                 */
+/*  Copyright 2010-2018 by                                                 */
 /*  Joel Klinghed.                                                         */
 /*                                                                         */
 /*  based on `src/gzip/ftgzip.c'                                           */
index f63ddc4..95954d7 100644 (file)
@@ -2,7 +2,7 @@
 # FreeType 2 BZIP2 support configuration rules
 #
 
-# Copyright 2010-2017 by
+# Copyright 2010-2018 by
 # Joel Klinghed.
 #
 # based on `src/lzw/rules.mk'
index 0880af8..53f4c7b 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/cache Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 8226188..1b425af 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType Caching sub-system (body only).                         */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 289bd5c..994aa12 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType basic cache interface (body).                           */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
     if ( anode )
       *anode  = NULL;
 
-    if ( (FT_ULong)( type->flags - FT_INT_MIN ) > FT_UINT_MAX )
+    /*
+     * Internal `FTC_BasicAttr->load_flags' is of type `FT_UInt',
+     * but public `FT_ImageType->flags' is of type `FT_Int32'.
+     *
+     * On 16bit systems, higher bits of type->flags cannot be handled.
+     */
+#if 0xFFFFFFFFUL > FT_UINT_MAX
+    if ( (type->flags & (FT_ULong)FT_UINT_MAX) )
       FT_TRACE1(( "FTC_ImageCache_Lookup:"
                   " higher bits in load_flags 0x%x are dropped\n",
                   (FT_ULong)type->flags & ~((FT_ULong)FT_UINT_MAX) ));
+#endif
 
     query.attrs.scaler.face_id = type->face_id;
     query.attrs.scaler.width   = type->width;
     if ( anode )
       *anode  = NULL;
 
-    /* `FT_Load_Glyph' and `FT_Load_Char' take FT_UInt flags */
+    /*
+     * Internal `FTC_BasicAttr->load_flags' is of type `FT_UInt',
+     * but public `FT_Face->face_flags' is of type `FT_Long'.
+     *
+     * On long > int systems, higher bits of load_flags cannot be handled.
+     */
+#if FT_ULONG_MAX > FT_UINT_MAX
     if ( load_flags > FT_UINT_MAX )
       FT_TRACE1(( "FTC_ImageCache_LookupScaler:"
                   " higher bits in load_flags 0x%x are dropped\n",
                   load_flags & ~((FT_ULong)FT_UINT_MAX) ));
+#endif
 
     query.attrs.scaler     = scaler[0];
     query.attrs.load_flags = (FT_UInt)load_flags;
 
     *ansbit = NULL;
 
-    if ( (FT_ULong)( type->flags - FT_INT_MIN ) > FT_UINT_MAX )
+    /*
+     * Internal `FTC_BasicAttr->load_flags' is of type `FT_UInt',
+     * but public `FT_ImageType->flags' is of type `FT_Int32'.
+     *
+     * On 16bit systems, higher bits of type->flags cannot be handled.
+     */
+#if 0xFFFFFFFFUL > FT_UINT_MAX
+    if ( (type->flags & (FT_ULong)FT_UINT_MAX) )
       FT_TRACE1(( "FTC_ImageCache_Lookup:"
                   " higher bits in load_flags 0x%x are dropped\n",
                   (FT_ULong)type->flags & ~((FT_ULong)FT_UINT_MAX) ));
+#endif
 
     query.attrs.scaler.face_id = type->face_id;
     query.attrs.scaler.width   = type->width;
 
     *ansbit = NULL;
 
-    /* `FT_Load_Glyph' and `FT_Load_Char' take FT_UInt flags */
+    /*
+     * Internal `FTC_BasicAttr->load_flags' is of type `FT_UInt',
+     * but public `FT_Face->face_flags' is of type `FT_Long'.
+     *
+     * On long > int systems, higher bits of load_flags cannot be handled.
+     */
+#if FT_ULONG_MAX > FT_UINT_MAX
     if ( load_flags > FT_UINT_MAX )
       FT_TRACE1(( "FTC_ImageCache_LookupScaler:"
                   " higher bits in load_flags 0x%x are dropped\n",
                   load_flags & ~((FT_ULong)FT_UINT_MAX) ));
+#endif
 
     query.attrs.scaler     = scaler[0];
     query.attrs.load_flags = (FT_UInt)load_flags;
index 37dc3ab..12ec585 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType internal cache interface (body).                        */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index d3c11ce..859c547 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType internal cache interface (specification).                   */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 2681e8c..e51d8d6 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Callback functions of the caching sub-system (specification only).   */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 2fa8497..d20b0f4 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType CharMap cache (body)                                        */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 84fe52f..a26cd59 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Caching sub-system error codes (specification only).                 */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index d2468f2..782cc0e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Glyph Image (FT_Glyph) cache (body).                        */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index cab58ed..23c24d2 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType abstract glyph cache (specification).                       */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 359f818..77a1001 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Image cache (body).                                         */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 14049af..24a2210 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Generic Image cache (specification)                         */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index edec2b6..2bcd9df 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Cache Manager (body).                                       */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 556842e..b4b4755 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Cache Manager (specification).                              */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index e293269..1087be4 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType MRU support (body).                                         */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index c4c330d..82396b9 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Simple MRU list-cache (specification).                               */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 2f9336d..018f1ec 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType sbits manager (body).                                       */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 1e15ce9..206a1bb 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    A small-bitmap cache (specification).                                */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 6204689..5589359 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2000-2017 by
+# Copyright 2000-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index e6dd05f..53c904f 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/cff Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -23,15 +23,6 @@ SubDir  FT2_TOP $(FT2_SRC_DIR) cff ;
                cffobjs
                cffparse
                cffpic
-               cf2arrst
-               cf2blues
-               cf2error
-               cf2font
-               cf2ft
-               cf2hints
-               cf2intrp
-               cf2read
-               cf2stack
                ;
   }
   else
diff --git a/src/cff/cf2intrp.c b/src/cff/cf2intrp.c
deleted file mode 100644 (file)
index 40bd905..0000000
+++ /dev/null
@@ -1,1920 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2intrp.c                                                             */
-/*                                                                         */
-/*    Adobe's CFF Interpreter (body).                                      */
-/*                                                                         */
-/*  Copyright 2007-2014 Adobe Systems Incorporated.                        */
-/*                                                                         */
-/*  This software, and all works of authorship, whether in source or       */
-/*  object code form as indicated by the copyright notice(s) included      */
-/*  herein (collectively, the "Work") is made available, and may only be   */
-/*  used, modified, and distributed under the FreeType Project License,    */
-/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
-/*  FreeType Project License, each contributor to the Work hereby grants   */
-/*  to any individual or legal entity exercising permissions granted by    */
-/*  the FreeType Project License and this section (hereafter, "You" or     */
-/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
-/*  royalty-free, irrevocable (except as stated in this section) patent    */
-/*  license to make, have made, use, offer to sell, sell, import, and      */
-/*  otherwise transfer the Work, where such license applies only to those  */
-/*  patent claims licensable by such contributor that are necessarily      */
-/*  infringed by their contribution(s) alone or by combination of their    */
-/*  contribution(s) with the Work to which such contribution(s) was        */
-/*  submitted.  If You institute patent litigation against any entity      */
-/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
-/*  the Work or a contribution incorporated within the Work constitutes    */
-/*  direct or contributory patent infringement, then any patent licenses   */
-/*  granted to You under this License for that Work shall terminate as of  */
-/*  the date such litigation is filed.                                     */
-/*                                                                         */
-/*  By using, modifying, or distributing the Work you indicate that you    */
-/*  have read and understood the terms and conditions of the               */
-/*  FreeType Project License as well as those provided in this section,    */
-/*  and you accept them fully.                                             */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include "cf2ft.h"
-#include FT_INTERNAL_DEBUG_H
-
-#include "cf2glue.h"
-#include "cf2font.h"
-#include "cf2stack.h"
-#include "cf2hints.h"
-#include "cf2intrp.h"
-
-#include "cf2error.h"
-
-#include "cffload.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_cf2interp
-
-
-  FT_LOCAL_DEF( void )
-  cf2_hintmask_init( CF2_HintMask  hintmask,
-                     FT_Error*     error )
-  {
-    FT_ZERO( hintmask );
-
-    hintmask->error = error;
-  }
-
-
-  FT_LOCAL_DEF( FT_Bool )
-  cf2_hintmask_isValid( const CF2_HintMask  hintmask )
-  {
-    return hintmask->isValid;
-  }
-
-
-  FT_LOCAL_DEF( FT_Bool )
-  cf2_hintmask_isNew( const CF2_HintMask  hintmask )
-  {
-    return hintmask->isNew;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_hintmask_setNew( CF2_HintMask  hintmask,
-                       FT_Bool       val )
-  {
-    hintmask->isNew = val;
-  }
-
-
-  /* clients call `getMaskPtr' in order to iterate */
-  /* through hint mask                             */
-
-  FT_LOCAL_DEF( FT_Byte* )
-  cf2_hintmask_getMaskPtr( CF2_HintMask  hintmask )
-  {
-    return hintmask->mask;
-  }
-
-
-  static size_t
-  cf2_hintmask_setCounts( CF2_HintMask  hintmask,
-                          size_t        bitCount )
-  {
-    if ( bitCount > CF2_MAX_HINTS )
-    {
-      /* total of h and v stems must be <= 96 */
-      CF2_SET_ERROR( hintmask->error, Invalid_Glyph_Format );
-      return 0;
-    }
-
-    hintmask->bitCount  = bitCount;
-    hintmask->byteCount = ( hintmask->bitCount + 7 ) / 8;
-
-    hintmask->isValid = TRUE;
-    hintmask->isNew   = TRUE;
-
-    return bitCount;
-  }
-
-
-  /* consume the hintmask bytes from the charstring, advancing the src */
-  /* pointer                                                           */
-  static void
-  cf2_hintmask_read( CF2_HintMask  hintmask,
-                     CF2_Buffer    charstring,
-                     size_t        bitCount )
-  {
-    size_t  i;
-
-#ifndef CF2_NDEBUG
-    /* these are the bits in the final mask byte that should be zero  */
-    /* Note: this variable is only used in an assert expression below */
-    /* and then only if CF2_NDEBUG is not defined                     */
-    CF2_UInt  mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;
-#endif
-
-
-    /* initialize counts and isValid */
-    if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )
-      return;
-
-    FT_ASSERT( hintmask->byteCount > 0 );
-
-    FT_TRACE4(( " (maskbytes:" ));
-
-    /* set mask and advance interpreter's charstring pointer */
-    for ( i = 0; i < hintmask->byteCount; i++ )
-    {
-      hintmask->mask[i] = (FT_Byte)cf2_buf_readByte( charstring );
-      FT_TRACE4(( " 0x%02X", hintmask->mask[i] ));
-    }
-
-    FT_TRACE4(( ")\n" ));
-
-    /* assert any unused bits in last byte are zero unless there's a prior */
-    /* error                                                               */
-    /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1      */
-#ifndef CF2_NDEBUG
-    FT_ASSERT( ( hintmask->mask[hintmask->byteCount - 1] & mask ) == 0 ||
-               *hintmask->error                                        );
-#endif
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_hintmask_setAll( CF2_HintMask  hintmask,
-                       size_t        bitCount )
-  {
-    size_t    i;
-    CF2_UInt  mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;
-
-
-    /* initialize counts and isValid */
-    if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )
-      return;
-
-    FT_ASSERT( hintmask->byteCount > 0 );
-    FT_ASSERT( hintmask->byteCount <=
-                 sizeof ( hintmask->mask ) / sizeof ( hintmask->mask[0] ) );
-
-    /* set mask to all ones */
-    for ( i = 0; i < hintmask->byteCount; i++ )
-      hintmask->mask[i] = 0xFF;
-
-    /* clear unused bits                                              */
-    /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */
-    hintmask->mask[hintmask->byteCount - 1] &= ~mask;
-  }
-
-
-  /* Type2 charstring opcodes */
-  enum
-  {
-    cf2_cmdRESERVED_0,   /* 0 */
-    cf2_cmdHSTEM,        /* 1 */
-    cf2_cmdRESERVED_2,   /* 2 */
-    cf2_cmdVSTEM,        /* 3 */
-    cf2_cmdVMOVETO,      /* 4 */
-    cf2_cmdRLINETO,      /* 5 */
-    cf2_cmdHLINETO,      /* 6 */
-    cf2_cmdVLINETO,      /* 7 */
-    cf2_cmdRRCURVETO,    /* 8 */
-    cf2_cmdRESERVED_9,   /* 9 */
-    cf2_cmdCALLSUBR,     /* 10 */
-    cf2_cmdRETURN,       /* 11 */
-    cf2_cmdESC,          /* 12 */
-    cf2_cmdRESERVED_13,  /* 13 */
-    cf2_cmdENDCHAR,      /* 14 */
-    cf2_cmdVSINDEX,      /* 15 */
-    cf2_cmdBLEND,        /* 16 */
-    cf2_cmdRESERVED_17,  /* 17 */
-    cf2_cmdHSTEMHM,      /* 18 */
-    cf2_cmdHINTMASK,     /* 19 */
-    cf2_cmdCNTRMASK,     /* 20 */
-    cf2_cmdRMOVETO,      /* 21 */
-    cf2_cmdHMOVETO,      /* 22 */
-    cf2_cmdVSTEMHM,      /* 23 */
-    cf2_cmdRCURVELINE,   /* 24 */
-    cf2_cmdRLINECURVE,   /* 25 */
-    cf2_cmdVVCURVETO,    /* 26 */
-    cf2_cmdHHCURVETO,    /* 27 */
-    cf2_cmdEXTENDEDNMBR, /* 28 */
-    cf2_cmdCALLGSUBR,    /* 29 */
-    cf2_cmdVHCURVETO,    /* 30 */
-    cf2_cmdHVCURVETO     /* 31 */
-  };
-
-  enum
-  {
-    cf2_escDOTSECTION,   /* 0 */
-    cf2_escRESERVED_1,   /* 1 */
-    cf2_escRESERVED_2,   /* 2 */
-    cf2_escAND,          /* 3 */
-    cf2_escOR,           /* 4 */
-    cf2_escNOT,          /* 5 */
-    cf2_escRESERVED_6,   /* 6 */
-    cf2_escRESERVED_7,   /* 7 */
-    cf2_escRESERVED_8,   /* 8 */
-    cf2_escABS,          /* 9 */
-    cf2_escADD,          /* 10     like otherADD */
-    cf2_escSUB,          /* 11     like otherSUB */
-    cf2_escDIV,          /* 12 */
-    cf2_escRESERVED_13,  /* 13 */
-    cf2_escNEG,          /* 14 */
-    cf2_escEQ,           /* 15 */
-    cf2_escRESERVED_16,  /* 16 */
-    cf2_escRESERVED_17,  /* 17 */
-    cf2_escDROP,         /* 18 */
-    cf2_escRESERVED_19,  /* 19 */
-    cf2_escPUT,          /* 20     like otherPUT    */
-    cf2_escGET,          /* 21     like otherGET    */
-    cf2_escIFELSE,       /* 22     like otherIFELSE */
-    cf2_escRANDOM,       /* 23     like otherRANDOM */
-    cf2_escMUL,          /* 24     like otherMUL    */
-    cf2_escRESERVED_25,  /* 25 */
-    cf2_escSQRT,         /* 26 */
-    cf2_escDUP,          /* 27     like otherDUP    */
-    cf2_escEXCH,         /* 28     like otherEXCH   */
-    cf2_escINDEX,        /* 29 */
-    cf2_escROLL,         /* 30 */
-    cf2_escRESERVED_31,  /* 31 */
-    cf2_escRESERVED_32,  /* 32 */
-    cf2_escRESERVED_33,  /* 33 */
-    cf2_escHFLEX,        /* 34 */
-    cf2_escFLEX,         /* 35 */
-    cf2_escHFLEX1,       /* 36 */
-    cf2_escFLEX1,        /* 37 */
-    cf2_escRESERVED_38   /* 38     & all higher     */
-  };
-
-
-  /* `stemHintArray' does not change once we start drawing the outline. */
-  static void
-  cf2_doStems( const CF2_Font  font,
-               CF2_Stack       opStack,
-               CF2_ArrStack    stemHintArray,
-               CF2_Fixed*      width,
-               FT_Bool*        haveWidth,
-               CF2_Fixed       hintOffset )
-  {
-    CF2_UInt  i;
-    CF2_UInt  count       = cf2_stack_count( opStack );
-    FT_Bool   hasWidthArg = (FT_Bool)( count & 1 );
-
-    /* variable accumulates delta values from operand stack */
-    CF2_Fixed  position = hintOffset;
-
-
-    if ( hasWidthArg && !*haveWidth )
-      *width = cf2_stack_getReal( opStack, 0 ) +
-                 cf2_getNominalWidthX( font->decoder );
-
-    if ( font->decoder->width_only )
-      goto exit;
-
-    for ( i = hasWidthArg ? 1 : 0; i < count; i += 2 )
-    {
-      /* construct a CF2_StemHint and push it onto the list */
-      CF2_StemHintRec  stemhint;
-
-
-      stemhint.min  =
-        position   += cf2_stack_getReal( opStack, i );
-      stemhint.max  =
-        position   += cf2_stack_getReal( opStack, i + 1 );
-
-      stemhint.used  = FALSE;
-      stemhint.maxDS =
-      stemhint.minDS = 0;
-
-      cf2_arrstack_push( stemHintArray, &stemhint ); /* defer error check */
-    }
-
-    cf2_stack_clear( opStack );
-
-  exit:
-    /* cf2_doStems must define a width (may be default) */
-    *haveWidth = TRUE;
-  }
-
-
-  static void
-  cf2_doFlex( CF2_Stack       opStack,
-              CF2_Fixed*      curX,
-              CF2_Fixed*      curY,
-              CF2_GlyphPath   glyphPath,
-              const FT_Bool*  readFromStack,
-              FT_Bool         doConditionalLastRead )
-  {
-    CF2_Fixed  vals[14];
-    CF2_UInt   idx;
-    FT_Bool    isHFlex;
-    CF2_Int    top, i, j;
-
-
-    vals[0] = *curX;
-    vals[1] = *curY;
-    idx     = 0;
-    isHFlex = FT_BOOL( readFromStack[9] == FALSE );
-    top     = isHFlex ? 9 : 10;
-
-    for ( i = 0; i < top; i++ )
-    {
-      vals[i + 2] = vals[i];
-      if ( readFromStack[i] )
-        vals[i + 2] += cf2_stack_getReal( opStack, idx++ );
-    }
-
-    if ( isHFlex )
-      vals[9 + 2] = *curY;
-
-    if ( doConditionalLastRead )
-    {
-      FT_Bool    lastIsX = (FT_Bool)( cf2_fixedAbs( vals[10] - *curX ) >
-                                        cf2_fixedAbs( vals[11] - *curY ) );
-      CF2_Fixed  lastVal = cf2_stack_getReal( opStack, idx );
-
-
-      if ( lastIsX )
-      {
-        vals[12] = vals[10] + lastVal;
-        vals[13] = *curY;
-      }
-      else
-      {
-        vals[12] = *curX;
-        vals[13] = vals[11] + lastVal;
-      }
-    }
-    else
-    {
-      if ( readFromStack[10] )
-        vals[12] = vals[10] + cf2_stack_getReal( opStack, idx++ );
-      else
-        vals[12] = *curX;
-
-      if ( readFromStack[11] )
-        vals[13] = vals[11] + cf2_stack_getReal( opStack, idx );
-      else
-        vals[13] = *curY;
-    }
-
-    for ( j = 0; j < 2; j++ )
-      cf2_glyphpath_curveTo( glyphPath, vals[j * 6 + 2],
-                                        vals[j * 6 + 3],
-                                        vals[j * 6 + 4],
-                                        vals[j * 6 + 5],
-                                        vals[j * 6 + 6],
-                                        vals[j * 6 + 7] );
-
-    cf2_stack_clear( opStack );
-
-    *curX = vals[12];
-    *curY = vals[13];
-  }
-
-
-  /* Blend numOperands on the stack,                */
-  /* store results into the first numBlends values, */
-  /* then pop remaining arguments.                  */
-  static void
-  cf2_doBlend( const CFF_Blend  blend,
-               CF2_Stack        opStack,
-               CF2_UInt         numBlends )
-  {
-    CF2_UInt  delta;
-    CF2_UInt  base;
-    CF2_UInt  i, j;
-    CF2_UInt  numOperands = (CF2_UInt)( numBlends * blend->lenBV );
-
-
-    base  = cf2_stack_count( opStack ) - numOperands;
-    delta = base + numBlends;
-
-    for ( i = 0; i < numBlends; i++ )
-    {
-      const CF2_Fixed*  weight = &blend->BV[1];
-
-      /* start with first term */
-      CF2_Fixed  sum = cf2_stack_getReal( opStack, i + base );
-
-
-      for ( j = 1; j < blend->lenBV; j++ )
-        sum += FT_MulFix( *weight++, cf2_stack_getReal( opStack, delta++ ) );
-
-      /* store blended result  */
-      cf2_stack_setReal( opStack, i + base, sum );
-    }
-
-    /* leave only `numBlends' results on stack */
-    cf2_stack_pop( opStack, numOperands - numBlends );
-  }
-
-
-  /*
-   * `error' is a shared error code used by many objects in this
-   * routine.  Before the code continues from an error, it must check and
-   * record the error in `*error'.  The idea is that this shared
-   * error code will record the first error encountered.  If testing
-   * for an error anyway, the cost of `goto exit' is small, so we do it,
-   * even if continuing would be safe.  In this case, `lastError' is
-   * set, so the testing and storing can be done in one place, at `exit'.
-   *
-   * Continuing after an error is intended for objects which do their own
-   * testing of `*error', e.g., array stack functions.  This allows us to
-   * avoid an extra test after the call.
-   *
-   * Unimplemented opcodes are ignored.
-   *
-   */
-  FT_LOCAL_DEF( void )
-  cf2_interpT2CharString( CF2_Font              font,
-                          CF2_Buffer            buf,
-                          CF2_OutlineCallbacks  callbacks,
-                          const FT_Vector*      translation,
-                          FT_Bool               doingSeac,
-                          CF2_Fixed             curX,
-                          CF2_Fixed             curY,
-                          CF2_Fixed*            width )
-  {
-    /* lastError is used for errors that are immediately tested */
-    FT_Error  lastError = FT_Err_Ok;
-
-    /* pointer to parsed font object */
-    CFF_Decoder*  decoder = font->decoder;
-
-    FT_Error*  error  = &font->error;
-    FT_Memory  memory = font->memory;
-
-    CF2_Fixed  scaleY        = font->innerTransform.d;
-    CF2_Fixed  nominalWidthX = cf2_getNominalWidthX( decoder );
-
-    /* save this for hinting seac accents */
-    CF2_Fixed  hintOriginY = curY;
-
-    CF2_Stack  opStack = NULL;
-    FT_UInt    stackSize;
-    FT_Byte    op1;                       /* first opcode byte */
-
-    CF2_F16Dot16  storage[CF2_STORAGE_SIZE];    /* for `put' and `get' */
-
-    /* instruction limit; 20,000,000 matches Avalon */
-    FT_UInt32  instructionLimit = 20000000UL;
-
-    CF2_ArrStackRec  subrStack;
-
-    FT_Bool     haveWidth;
-    CF2_Buffer  charstring = NULL;
-
-    CF2_Int  charstringIndex = -1;       /* initialize to empty */
-
-    /* TODO: placeholders for hint structures */
-
-    /* objects used for hinting */
-    CF2_ArrStackRec  hStemHintArray;
-    CF2_ArrStackRec  vStemHintArray;
-
-    CF2_HintMaskRec   hintMask;
-    CF2_GlyphPathRec  glyphPath;
-
-
-    FT_ZERO( &storage );
-
-    /* initialize the remaining objects */
-    cf2_arrstack_init( &subrStack,
-                       memory,
-                       error,
-                       sizeof ( CF2_BufferRec ) );
-    cf2_arrstack_init( &hStemHintArray,
-                       memory,
-                       error,
-                       sizeof ( CF2_StemHintRec ) );
-    cf2_arrstack_init( &vStemHintArray,
-                       memory,
-                       error,
-                       sizeof ( CF2_StemHintRec ) );
-
-    /* initialize CF2_StemHint arrays */
-    cf2_hintmask_init( &hintMask, error );
-
-    /* initialize path map to manage drawing operations */
-
-    /* Note: last 4 params are used to handle `MoveToPermissive', which */
-    /*       may need to call `hintMap.Build'                           */
-    /* TODO: MoveToPermissive is gone; are these still needed?          */
-    cf2_glyphpath_init( &glyphPath,
-                        font,
-                        callbacks,
-                        scaleY,
-                        /* hShift, */
-                        &hStemHintArray,
-                        &vStemHintArray,
-                        &hintMask,
-                        hintOriginY,
-                        &font->blues,
-                        translation );
-
-    /*
-     * Initialize state for width parsing.  From the CFF Spec:
-     *
-     *   The first stack-clearing operator, which must be one of hstem,
-     *   hstemhm, vstem, vstemhm, cntrmask, hintmask, hmoveto, vmoveto,
-     *   rmoveto, or endchar, takes an additional argument - the width (as
-     *   described earlier), which may be expressed as zero or one numeric
-     *   argument.
-     *
-     * What we implement here uses the first validly specified width, but
-     * does not detect errors for specifying more than one width.
-     *
-     * If one of the above operators occurs without explicitly specifying
-     * a width, we assume the default width.
-     *
-     * CFF2 charstrings always return the default width (0).
-     *
-     */
-    haveWidth = font->isCFF2 ? TRUE : FALSE;
-    *width    = cf2_getDefaultWidthX( decoder );
-
-    /*
-     * Note: At this point, all pointers to resources must be NULL
-     *       and all local objects must be initialized.
-     *       There must be no branches to `exit:' above this point.
-     *
-     */
-
-    /* allocate an operand stack */
-    stackSize = font->isCFF2 ? cf2_getMaxstack( decoder )
-                             : CF2_OPERAND_STACK_SIZE;
-    opStack   = cf2_stack_init( memory, error, stackSize );
-
-    if ( !opStack )
-    {
-      lastError = FT_THROW( Out_Of_Memory );
-      goto exit;
-    }
-
-    /* initialize subroutine stack by placing top level charstring as */
-    /* first element (max depth plus one for the charstring)          */
-    /* Note: Caller owns and must finalize the first charstring.      */
-    /*       Our copy of it does not change that requirement.         */
-    cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 );
-
-    charstring  = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack );
-    *charstring = *buf;    /* structure copy */
-
-    charstringIndex = 0;       /* entry is valid now */
-
-    /* catch errors so far */
-    if ( *error )
-      goto exit;
-
-    /* main interpreter loop */
-    while ( 1 )
-    {
-      if ( cf2_buf_isEnd( charstring ) )
-      {
-        /* If we've reached the end of the charstring, simulate a */
-        /* cf2_cmdRETURN or cf2_cmdENDCHAR.                       */
-        /* We do this for both CFF and CFF2.                      */
-        if ( charstringIndex )
-          op1 = cf2_cmdRETURN;  /* end of buffer for subroutine */
-        else
-          op1 = cf2_cmdENDCHAR; /* end of buffer for top level charstring */
-      }
-      else
-      {
-        op1 = (FT_Byte)cf2_buf_readByte( charstring );
-
-        /* Explicit RETURN and ENDCHAR in CFF2 should be ignored. */
-        /* Note: Trace message will report 0 instead of 11 or 14. */
-        if ( ( op1 == cf2_cmdRETURN || op1 == cf2_cmdENDCHAR ) &&
-             font->isCFF2                                      )
-          op1 = cf2_cmdRESERVED_0;
-      }
-
-      /* check for errors once per loop */
-      if ( *error )
-        goto exit;
-
-      instructionLimit--;
-      if ( instructionLimit == 0 )
-      {
-        lastError = FT_THROW( Invalid_Glyph_Format );
-        goto exit;
-      }
-
-      switch( op1 )
-      {
-      case cf2_cmdRESERVED_0:
-      case cf2_cmdRESERVED_2:
-      case cf2_cmdRESERVED_9:
-      case cf2_cmdRESERVED_13:
-      case cf2_cmdRESERVED_17:
-        /* we may get here if we have a prior error */
-        FT_TRACE4(( " unknown op (%d)\n", op1 ));
-        break;
-
-      case cf2_cmdVSINDEX:
-        FT_TRACE4(( " vsindex\n" ));
-
-        if ( !font->isCFF2 )
-          break;    /* clear stack & ignore */
-
-        if ( font->blend.usedBV )
-        {
-          /* vsindex not allowed after blend */
-          lastError = FT_THROW( Invalid_Glyph_Format );
-          goto exit;
-        }
-
-        {
-          FT_Int  temp = cf2_stack_popInt( opStack );
-
-
-          if ( temp >= 0 )
-            font->vsindex = (FT_UInt)temp;
-        }
-        break;
-
-      case cf2_cmdBLEND:
-        {
-          FT_UInt  numBlends;
-
-
-          FT_TRACE4(( " blend\n" ));
-
-          if ( !font->isCFF2 )
-            break;    /* clear stack & ignore */
-
-          /* do we have a `blend' op in a non-variant font? */
-          if ( !font->blend.font )
-          {
-            lastError = FT_THROW( Invalid_Glyph_Format );
-            goto exit;
-          }
-
-          /* check cached blend vector */
-          if ( cff_blend_check_vector( &font->blend,
-                                       font->vsindex,
-                                       font->lenNDV,
-                                       font->NDV ) )
-          {
-            lastError = cff_blend_build_vector( &font->blend,
-                                                font->vsindex,
-                                                font->lenNDV,
-                                                font->NDV );
-            if ( lastError )
-              goto exit;
-          }
-
-          /* do the blend */
-          numBlends = (FT_UInt)cf2_stack_popInt( opStack );
-          if ( numBlends > stackSize )
-          {
-            lastError = FT_THROW( Invalid_Glyph_Format );
-            goto exit;
-          }
-
-          cf2_doBlend( &font->blend, opStack, numBlends );
-
-          font->blend.usedBV = TRUE;
-        }
-        continue;     /* do not clear the stack */
-
-      case cf2_cmdHSTEMHM:
-      case cf2_cmdHSTEM:
-        FT_TRACE4(( op1 == cf2_cmdHSTEMHM ? " hstemhm\n" : " hstem\n" ));
-
-        /* never add hints after the mask is computed */
-        if ( cf2_hintmask_isValid( &hintMask ) )
-        {
-          FT_TRACE4(( "cf2_interpT2CharString:"
-                      " invalid horizontal hint mask\n" ));
-          break;
-        }
-
-        cf2_doStems( font,
-                     opStack,
-                     &hStemHintArray,
-                     width,
-                     &haveWidth,
-                     0 );
-
-        if ( font->decoder->width_only )
-          goto exit;
-
-        break;
-
-      case cf2_cmdVSTEMHM:
-      case cf2_cmdVSTEM:
-        FT_TRACE4(( op1 == cf2_cmdVSTEMHM ? " vstemhm\n" : " vstem\n" ));
-
-        /* never add hints after the mask is computed */
-        if ( cf2_hintmask_isValid( &hintMask ) )
-        {
-          FT_TRACE4(( "cf2_interpT2CharString:"
-                      " invalid vertical hint mask\n" ));
-          break;
-        }
-
-        cf2_doStems( font,
-                     opStack,
-                     &vStemHintArray,
-                     width,
-                     &haveWidth,
-                     0 );
-
-        if ( font->decoder->width_only )
-          goto exit;
-
-        break;
-
-      case cf2_cmdVMOVETO:
-        FT_TRACE4(( " vmoveto\n" ));
-
-        if ( cf2_stack_count( opStack ) > 1 && !haveWidth )
-          *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
-
-        /* width is defined or default after this */
-        haveWidth = TRUE;
-
-        if ( font->decoder->width_only )
-          goto exit;
-
-        curY += cf2_stack_popFixed( opStack );
-
-        cf2_glyphpath_moveTo( &glyphPath, curX, curY );
-
-        break;
-
-      case cf2_cmdRLINETO:
-        {
-          CF2_UInt  idx;
-          CF2_UInt  count = cf2_stack_count( opStack );
-
-
-          FT_TRACE4(( " rlineto\n" ));
-
-          for ( idx = 0; idx < count; idx += 2 )
-          {
-            curX += cf2_stack_getReal( opStack, idx + 0 );
-            curY += cf2_stack_getReal( opStack, idx + 1 );
-
-            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
-          }
-
-          cf2_stack_clear( opStack );
-        }
-        continue; /* no need to clear stack again */
-
-      case cf2_cmdHLINETO:
-      case cf2_cmdVLINETO:
-        {
-          CF2_UInt  idx;
-          CF2_UInt  count = cf2_stack_count( opStack );
-
-          FT_Bool  isX = FT_BOOL( op1 == cf2_cmdHLINETO );
-
-
-          FT_TRACE4(( isX ? " hlineto\n" : " vlineto\n" ));
-
-          for ( idx = 0; idx < count; idx++ )
-          {
-            CF2_Fixed  v = cf2_stack_getReal( opStack, idx );
-
-
-            if ( isX )
-              curX += v;
-            else
-              curY += v;
-
-            isX = !isX;
-
-            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
-          }
-
-          cf2_stack_clear( opStack );
-        }
-        continue;
-
-      case cf2_cmdRCURVELINE:
-      case cf2_cmdRRCURVETO:
-        {
-          CF2_UInt  count = cf2_stack_count( opStack );
-          CF2_UInt  idx   = 0;
-
-
-          FT_TRACE4(( op1 == cf2_cmdRCURVELINE ? " rcurveline\n"
-                                               : " rrcurveto\n" ));
-
-          while ( idx + 6 <= count )
-          {
-            CF2_Fixed  x1 = cf2_stack_getReal( opStack, idx + 0 ) + curX;
-            CF2_Fixed  y1 = cf2_stack_getReal( opStack, idx + 1 ) + curY;
-            CF2_Fixed  x2 = cf2_stack_getReal( opStack, idx + 2 ) + x1;
-            CF2_Fixed  y2 = cf2_stack_getReal( opStack, idx + 3 ) + y1;
-            CF2_Fixed  x3 = cf2_stack_getReal( opStack, idx + 4 ) + x2;
-            CF2_Fixed  y3 = cf2_stack_getReal( opStack, idx + 5 ) + y2;
-
-
-            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
-
-            curX  = x3;
-            curY  = y3;
-            idx  += 6;
-          }
-
-          if ( op1 == cf2_cmdRCURVELINE )
-          {
-            curX += cf2_stack_getReal( opStack, idx + 0 );
-            curY += cf2_stack_getReal( opStack, idx + 1 );
-
-            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
-          }
-
-          cf2_stack_clear( opStack );
-        }
-        continue; /* no need to clear stack again */
-
-      case cf2_cmdCALLGSUBR:
-      case cf2_cmdCALLSUBR:
-        {
-          CF2_Int  subrNum;
-
-
-          FT_TRACE4(( op1 == cf2_cmdCALLGSUBR ? " callgsubr"
-                                              : " callsubr" ));
-
-          if ( charstringIndex > CF2_MAX_SUBR )
-          {
-            /* max subr plus one for charstring */
-            lastError = FT_THROW( Invalid_Glyph_Format );
-            goto exit;                      /* overflow of stack */
-          }
-
-          /* push our current CFF charstring region on subrStack */
-          charstring = (CF2_Buffer)
-                         cf2_arrstack_getPointer(
-                           &subrStack,
-                           (size_t)charstringIndex + 1 );
-
-          /* set up the new CFF region and pointer */
-          subrNum = cf2_stack_popInt( opStack );
-
-          switch ( op1 )
-          {
-          case cf2_cmdCALLGSUBR:
-            FT_TRACE4(( " (idx %d, entering level %d)\n",
-                        subrNum + decoder->globals_bias,
-                        charstringIndex + 1 ));
-
-            if ( cf2_initGlobalRegionBuffer( decoder,
-                                             subrNum,
-                                             charstring ) )
-            {
-              lastError = FT_THROW( Invalid_Glyph_Format );
-              goto exit;  /* subroutine lookup or stream error */
-            }
-            break;
-
-          default:
-            /* cf2_cmdCALLSUBR */
-            FT_TRACE4(( " (idx %d, entering level %d)\n",
-                        subrNum + decoder->locals_bias,
-                        charstringIndex + 1 ));
-
-            if ( cf2_initLocalRegionBuffer( decoder,
-                                            subrNum,
-                                            charstring ) )
-            {
-              lastError = FT_THROW( Invalid_Glyph_Format );
-              goto exit;  /* subroutine lookup or stream error */
-            }
-          }
-
-          charstringIndex += 1;       /* entry is valid now */
-        }
-        continue; /* do not clear the stack */
-
-      case cf2_cmdRETURN:
-        FT_TRACE4(( " return (leaving level %d)\n", charstringIndex ));
-
-        if ( charstringIndex < 1 )
-        {
-          /* Note: cannot return from top charstring */
-          lastError = FT_THROW( Invalid_Glyph_Format );
-          goto exit;                      /* underflow of stack */
-        }
-
-        /* restore position in previous charstring */
-        charstring = (CF2_Buffer)
-                       cf2_arrstack_getPointer(
-                         &subrStack,
-                         (CF2_UInt)--charstringIndex );
-        continue;     /* do not clear the stack */
-
-      case cf2_cmdESC:
-        {
-          FT_Byte  op2 = (FT_Byte)cf2_buf_readByte( charstring );
-
-
-          /* first switch for 2-byte operators handles CFF2      */
-          /* and opcodes that are reserved for both CFF and CFF2 */
-          switch ( op2 )
-          {
-          case cf2_escHFLEX:
-            {
-              static const FT_Bool  readFromStack[12] =
-              {
-                TRUE /* dx1 */, FALSE /* dy1 */,
-                TRUE /* dx2 */, TRUE  /* dy2 */,
-                TRUE /* dx3 */, FALSE /* dy3 */,
-                TRUE /* dx4 */, FALSE /* dy4 */,
-                TRUE /* dx5 */, FALSE /* dy5 */,
-                TRUE /* dx6 */, FALSE /* dy6 */
-              };
-
-
-              FT_TRACE4(( " hflex\n" ));
-
-              cf2_doFlex( opStack,
-                          &curX,
-                          &curY,
-                          &glyphPath,
-                          readFromStack,
-                          FALSE /* doConditionalLastRead */ );
-            }
-            continue;
-
-          case cf2_escFLEX:
-            {
-              static const FT_Bool  readFromStack[12] =
-              {
-                TRUE /* dx1 */, TRUE /* dy1 */,
-                TRUE /* dx2 */, TRUE /* dy2 */,
-                TRUE /* dx3 */, TRUE /* dy3 */,
-                TRUE /* dx4 */, TRUE /* dy4 */,
-                TRUE /* dx5 */, TRUE /* dy5 */,
-                TRUE /* dx6 */, TRUE /* dy6 */
-              };
-
-
-              FT_TRACE4(( " flex\n" ));
-
-              cf2_doFlex( opStack,
-                          &curX,
-                          &curY,
-                          &glyphPath,
-                          readFromStack,
-                          FALSE /* doConditionalLastRead */ );
-            }
-            break;      /* TODO: why is this not a continue? */
-
-          case cf2_escHFLEX1:
-            {
-              static const FT_Bool  readFromStack[12] =
-              {
-                TRUE /* dx1 */, TRUE  /* dy1 */,
-                TRUE /* dx2 */, TRUE  /* dy2 */,
-                TRUE /* dx3 */, FALSE /* dy3 */,
-                TRUE /* dx4 */, FALSE /* dy4 */,
-                TRUE /* dx5 */, TRUE  /* dy5 */,
-                TRUE /* dx6 */, FALSE /* dy6 */
-              };
-
-
-              FT_TRACE4(( " hflex1\n" ));
-
-              cf2_doFlex( opStack,
-                          &curX,
-                          &curY,
-                          &glyphPath,
-                          readFromStack,
-                          FALSE /* doConditionalLastRead */ );
-            }
-            continue;
-
-          case cf2_escFLEX1:
-            {
-              static const FT_Bool  readFromStack[12] =
-              {
-                TRUE  /* dx1 */, TRUE  /* dy1 */,
-                TRUE  /* dx2 */, TRUE  /* dy2 */,
-                TRUE  /* dx3 */, TRUE  /* dy3 */,
-                TRUE  /* dx4 */, TRUE  /* dy4 */,
-                TRUE  /* dx5 */, TRUE  /* dy5 */,
-                FALSE /* dx6 */, FALSE /* dy6 */
-              };
-
-
-              FT_TRACE4(( " flex1\n" ));
-
-              cf2_doFlex( opStack,
-                          &curX,
-                          &curY,
-                          &glyphPath,
-                          readFromStack,
-                          TRUE /* doConditionalLastRead */ );
-            }
-            continue;
-
-          /* these opcodes are reserved in both CFF & CFF2 */
-          case cf2_escRESERVED_1:
-          case cf2_escRESERVED_2:
-          case cf2_escRESERVED_6:
-          case cf2_escRESERVED_7:
-          case cf2_escRESERVED_8:
-          case cf2_escRESERVED_13:
-          case cf2_escRESERVED_16:
-          case cf2_escRESERVED_17:
-          case cf2_escRESERVED_19:
-          case cf2_escRESERVED_25:
-          case cf2_escRESERVED_31:
-          case cf2_escRESERVED_32:
-          case cf2_escRESERVED_33:
-            FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
-            break;
-
-          default:
-            {
-              if ( font->isCFF2 || op2 >= cf2_escRESERVED_38 )
-                FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
-              else
-              {
-                /* second switch for 2-byte operators handles just CFF */
-                switch ( op2 )
-                {
-
-                case cf2_escDOTSECTION:
-                  /* something about `flip type of locking' -- ignore it */
-                  FT_TRACE4(( " dotsection\n" ));
-
-                  break;
-
-                case cf2_escAND:
-                  {
-                    CF2_F16Dot16  arg1;
-                    CF2_F16Dot16  arg2;
-
-
-                    FT_TRACE4(( " and\n" ));
-
-                    arg2 = cf2_stack_popFixed( opStack );
-                    arg1 = cf2_stack_popFixed( opStack );
-
-                    cf2_stack_pushInt( opStack, arg1 && arg2 );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escOR:
-                  {
-                    CF2_F16Dot16  arg1;
-                    CF2_F16Dot16  arg2;
-
-
-                    FT_TRACE4(( " or\n" ));
-
-                    arg2 = cf2_stack_popFixed( opStack );
-                    arg1 = cf2_stack_popFixed( opStack );
-
-                    cf2_stack_pushInt( opStack, arg1 || arg2 );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escNOT:
-                  {
-                    CF2_F16Dot16  arg;
-
-
-                    FT_TRACE4(( " not\n" ));
-
-                    arg = cf2_stack_popFixed( opStack );
-
-                    cf2_stack_pushInt( opStack, !arg );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escABS:
-                  {
-                    CF2_F16Dot16  arg;
-
-
-                    FT_TRACE4(( " abs\n" ));
-
-                    arg = cf2_stack_popFixed( opStack );
-
-                    cf2_stack_pushFixed( opStack, FT_ABS( arg ) );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escADD:
-                  {
-                    CF2_F16Dot16  summand1;
-                    CF2_F16Dot16  summand2;
-
-
-                    FT_TRACE4(( " add\n" ));
-
-                    summand2 = cf2_stack_popFixed( opStack );
-                    summand1 = cf2_stack_popFixed( opStack );
-
-                    cf2_stack_pushFixed( opStack, summand1 + summand2 );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escSUB:
-                  {
-                    CF2_F16Dot16  minuend;
-                    CF2_F16Dot16  subtrahend;
-
-
-                    FT_TRACE4(( " sub\n" ));
-
-                    subtrahend = cf2_stack_popFixed( opStack );
-                    minuend    = cf2_stack_popFixed( opStack );
-
-                    cf2_stack_pushFixed( opStack, minuend - subtrahend );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escDIV:
-                  {
-                    CF2_F16Dot16  dividend;
-                    CF2_F16Dot16  divisor;
-
-
-                    FT_TRACE4(( " div\n" ));
-
-                    divisor  = cf2_stack_popFixed( opStack );
-                    dividend = cf2_stack_popFixed( opStack );
-
-                    cf2_stack_pushFixed( opStack, FT_DivFix( dividend, divisor ) );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escNEG:
-                  {
-                    CF2_F16Dot16  arg;
-
-
-                    FT_TRACE4(( " neg\n" ));
-
-                    arg = cf2_stack_popFixed( opStack );
-
-                    cf2_stack_pushFixed( opStack, -arg );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escEQ:
-                  {
-                    CF2_F16Dot16  arg1;
-                    CF2_F16Dot16  arg2;
-
-
-                    FT_TRACE4(( " eq\n" ));
-
-                    arg2 = cf2_stack_popFixed( opStack );
-                    arg1 = cf2_stack_popFixed( opStack );
-
-                    cf2_stack_pushInt( opStack, arg1 == arg2 );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escDROP:
-                  FT_TRACE4(( " drop\n" ));
-
-                  (void)cf2_stack_popFixed( opStack );
-                  continue; /* do not clear the stack */
-
-                case cf2_escPUT:
-                  {
-                    CF2_F16Dot16  val;
-                    CF2_Int       idx;
-
-
-                    FT_TRACE4(( " put\n" ));
-
-                    idx = cf2_stack_popInt( opStack );
-                    val = cf2_stack_popFixed( opStack );
-
-                    if ( idx >= 0 && idx < CF2_STORAGE_SIZE )
-                      storage[idx] = val;
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escGET:
-                  {
-                    CF2_Int  idx;
-
-
-                    FT_TRACE4(( " get\n" ));
-
-                    idx = cf2_stack_popInt( opStack );
-
-                    if ( idx >= 0 && idx < CF2_STORAGE_SIZE )
-                      cf2_stack_pushFixed( opStack, storage[idx] );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escIFELSE:
-                  {
-                    CF2_F16Dot16  arg1;
-                    CF2_F16Dot16  arg2;
-                    CF2_F16Dot16  cond1;
-                    CF2_F16Dot16  cond2;
-
-
-                    FT_TRACE4(( " ifelse\n" ));
-
-                    cond2 = cf2_stack_popFixed( opStack );
-                    cond1 = cf2_stack_popFixed( opStack );
-                    arg2  = cf2_stack_popFixed( opStack );
-                    arg1  = cf2_stack_popFixed( opStack );
-
-                    cf2_stack_pushFixed( opStack, cond1 <= cond2 ? arg1 : arg2 );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escRANDOM: /* in spec */
-                  {
-                    CF2_F16Dot16  r;
-
-
-                    FT_TRACE4(( " random\n" ));
-
-                    /* only use the lower 16 bits of `random'  */
-                    /* to generate a number in the range (0;1] */
-                    r = (CF2_F16Dot16)
-                          ( ( decoder->current_subfont->random & 0xFFFF ) + 1 );
-
-                    decoder->current_subfont->random =
-                      cff_random( decoder->current_subfont->random );
-
-                    cf2_stack_pushFixed( opStack, r );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escMUL:
-                  {
-                    CF2_F16Dot16  factor1;
-                    CF2_F16Dot16  factor2;
-
-
-                    FT_TRACE4(( " mul\n" ));
-
-                    factor2 = cf2_stack_popFixed( opStack );
-                    factor1 = cf2_stack_popFixed( opStack );
-
-                    cf2_stack_pushFixed( opStack, FT_MulFix( factor1, factor2 ) );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escSQRT:
-                  {
-                    CF2_F16Dot16  arg;
-
-
-                    FT_TRACE4(( " sqrt\n" ));
-
-                    arg = cf2_stack_popFixed( opStack );
-                    if ( arg > 0 )
-                    {
-                      FT_Fixed  root = arg;
-                      FT_Fixed  new_root;
-
-
-                      /* Babylonian method */
-                      for (;;)
-                      {
-                        new_root = ( root + FT_DivFix( arg, root ) + 1 ) >> 1;
-                        if ( new_root == root )
-                          break;
-                        root = new_root;
-                      }
-                      arg = new_root;
-                    }
-                    else
-                      arg = 0;
-
-                    cf2_stack_pushFixed( opStack, arg );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escDUP:
-                  {
-                    CF2_F16Dot16  arg;
-
-
-                    FT_TRACE4(( " dup\n" ));
-
-                    arg = cf2_stack_popFixed( opStack );
-
-                    cf2_stack_pushFixed( opStack, arg );
-                    cf2_stack_pushFixed( opStack, arg );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escEXCH:
-                  {
-                    CF2_F16Dot16  arg1;
-                    CF2_F16Dot16  arg2;
-
-
-                    FT_TRACE4(( " exch\n" ));
-
-                    arg2 = cf2_stack_popFixed( opStack );
-                    arg1 = cf2_stack_popFixed( opStack );
-
-                    cf2_stack_pushFixed( opStack, arg2 );
-                    cf2_stack_pushFixed( opStack, arg1 );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escINDEX:
-                  {
-                    CF2_Int   idx;
-                    CF2_UInt  size;
-
-
-                    FT_TRACE4(( " index\n" ));
-
-                    idx  = cf2_stack_popInt( opStack );
-                    size = cf2_stack_count( opStack );
-
-                    if ( size > 0 )
-                    {
-                      /* for `cf2_stack_getReal', index 0 is bottom of stack */
-                      CF2_UInt  gr_idx;
-
-
-                      if ( idx < 0 )
-                        gr_idx = size - 1;
-                      else if ( (CF2_UInt)idx >= size )
-                        gr_idx = 0;
-                      else
-                        gr_idx = size - 1 - (CF2_UInt)idx;
-
-                      cf2_stack_pushFixed( opStack,
-                                           cf2_stack_getReal( opStack, gr_idx ) );
-                    }
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escROLL:
-                  {
-                    CF2_Int  idx;
-                    CF2_Int  count;
-
-
-                    FT_TRACE4(( " roll\n" ));
-
-                    idx   = cf2_stack_popInt( opStack );
-                    count = cf2_stack_popInt( opStack );
-
-                    cf2_stack_roll( opStack, count, idx );
-                  }
-                  continue; /* do not clear the stack */
-
-                } /* end of 2nd switch checking op2 */
-              }
-            }
-          } /* end of 1st switch checking op2 */
-        } /* case cf2_cmdESC */
-
-        break;
-
-      case cf2_cmdENDCHAR:
-        FT_TRACE4(( " endchar\n" ));
-
-        if ( cf2_stack_count( opStack ) == 1 ||
-             cf2_stack_count( opStack ) == 5 )
-        {
-          if ( !haveWidth )
-            *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
-        }
-
-        /* width is defined or default after this */
-        haveWidth = TRUE;
-
-        if ( font->decoder->width_only )
-          goto exit;
-
-        /* close path if still open */
-        cf2_glyphpath_closeOpenPath( &glyphPath );
-
-        /* disable seac for CFF2 (charstring ending with args on stack) */
-        if ( !font->isCFF2 && cf2_stack_count( opStack ) > 1 )
-        {
-          /* must be either 4 or 5 --                       */
-          /* this is a (deprecated) implied `seac' operator */
-
-          CF2_Int        achar;
-          CF2_Int        bchar;
-          CF2_BufferRec  component;
-          CF2_Fixed      dummyWidth;   /* ignore component width */
-          FT_Error       error2;
-
-
-          if ( doingSeac )
-          {
-            lastError = FT_THROW( Invalid_Glyph_Format );
-            goto exit;      /* nested seac */
-          }
-
-          achar = cf2_stack_popInt( opStack );
-          bchar = cf2_stack_popInt( opStack );
-
-          curY = cf2_stack_popFixed( opStack );
-          curX = cf2_stack_popFixed( opStack );
-
-          error2 = cf2_getSeacComponent( decoder, achar, &component );
-          if ( error2 )
-          {
-            lastError = error2;      /* pass FreeType error through */
-            goto exit;
-          }
-          cf2_interpT2CharString( font,
-                                  &component,
-                                  callbacks,
-                                  translation,
-                                  TRUE,
-                                  curX,
-                                  curY,
-                                  &dummyWidth );
-          cf2_freeSeacComponent( decoder, &component );
-
-          error2 = cf2_getSeacComponent( decoder, bchar, &component );
-          if ( error2 )
-          {
-            lastError = error2;      /* pass FreeType error through */
-            goto exit;
-          }
-          cf2_interpT2CharString( font,
-                                  &component,
-                                  callbacks,
-                                  translation,
-                                  TRUE,
-                                  0,
-                                  0,
-                                  &dummyWidth );
-          cf2_freeSeacComponent( decoder, &component );
-        }
-        goto exit;
-
-      case cf2_cmdCNTRMASK:
-      case cf2_cmdHINTMASK:
-        /* the final \n in the tracing message gets added in      */
-        /* `cf2_hintmask_read' (which also traces the mask bytes) */
-        FT_TRACE4(( op1 == cf2_cmdCNTRMASK ? " cntrmask" : " hintmask" ));
-
-        /* never add hints after the mask is computed */
-        if ( cf2_stack_count( opStack ) > 1    &&
-             cf2_hintmask_isValid( &hintMask ) )
-        {
-          FT_TRACE4(( "cf2_interpT2CharString: invalid hint mask\n" ));
-          break;
-        }
-
-        /* if there are arguments on the stack, there this is an */
-        /* implied cf2_cmdVSTEMHM                                */
-        cf2_doStems( font,
-                     opStack,
-                     &vStemHintArray,
-                     width,
-                     &haveWidth,
-                     0 );
-
-        if ( font->decoder->width_only )
-          goto exit;
-
-        if ( op1 == cf2_cmdHINTMASK )
-        {
-          /* consume the hint mask bytes which follow the operator */
-          cf2_hintmask_read( &hintMask,
-                             charstring,
-                             cf2_arrstack_size( &hStemHintArray ) +
-                               cf2_arrstack_size( &vStemHintArray ) );
-        }
-        else
-        {
-          /*
-           * Consume the counter mask bytes which follow the operator:
-           * Build a temporary hint map, just to place and lock those
-           * stems participating in the counter mask.  These are most
-           * likely the dominant hstems, and are grouped together in a
-           * few counter groups, not necessarily in correspondence
-           * with the hint groups.  This reduces the chances of
-           * conflicts between hstems that are initially placed in
-           * separate hint groups and then brought together.  The
-           * positions are copied back to `hStemHintArray', so we can
-           * discard `counterMask' and `counterHintMap'.
-           *
-           */
-          CF2_HintMapRec   counterHintMap;
-          CF2_HintMaskRec  counterMask;
-
-
-          cf2_hintmap_init( &counterHintMap,
-                            font,
-                            &glyphPath.initialHintMap,
-                            &glyphPath.hintMoves,
-                            scaleY );
-          cf2_hintmask_init( &counterMask, error );
-
-          cf2_hintmask_read( &counterMask,
-                             charstring,
-                             cf2_arrstack_size( &hStemHintArray ) +
-                               cf2_arrstack_size( &vStemHintArray ) );
-          cf2_hintmap_build( &counterHintMap,
-                             &hStemHintArray,
-                             &vStemHintArray,
-                             &counterMask,
-                             0,
-                             FALSE );
-        }
-        break;
-
-      case cf2_cmdRMOVETO:
-        FT_TRACE4(( " rmoveto\n" ));
-
-        if ( cf2_stack_count( opStack ) > 2 && !haveWidth )
-          *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
-
-        /* width is defined or default after this */
-        haveWidth = TRUE;
-
-        if ( font->decoder->width_only )
-          goto exit;
-
-        curY += cf2_stack_popFixed( opStack );
-        curX += cf2_stack_popFixed( opStack );
-
-        cf2_glyphpath_moveTo( &glyphPath, curX, curY );
-
-        break;
-
-      case cf2_cmdHMOVETO:
-        FT_TRACE4(( " hmoveto\n" ));
-
-        if ( cf2_stack_count( opStack ) > 1 && !haveWidth )
-          *width = cf2_stack_getReal( opStack, 0 ) + nominalWidthX;
-
-        /* width is defined or default after this */
-        haveWidth = TRUE;
-
-        if ( font->decoder->width_only )
-          goto exit;
-
-        curX += cf2_stack_popFixed( opStack );
-
-        cf2_glyphpath_moveTo( &glyphPath, curX, curY );
-
-        break;
-
-      case cf2_cmdRLINECURVE:
-        {
-          CF2_UInt  count = cf2_stack_count( opStack );
-          CF2_UInt  idx   = 0;
-
-
-          FT_TRACE4(( " rlinecurve\n" ));
-
-          while ( idx + 6 < count )
-          {
-            curX += cf2_stack_getReal( opStack, idx + 0 );
-            curY += cf2_stack_getReal( opStack, idx + 1 );
-
-            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
-            idx += 2;
-          }
-
-          while ( idx < count )
-          {
-            CF2_Fixed  x1 = cf2_stack_getReal( opStack, idx + 0 ) + curX;
-            CF2_Fixed  y1 = cf2_stack_getReal( opStack, idx + 1 ) + curY;
-            CF2_Fixed  x2 = cf2_stack_getReal( opStack, idx + 2 ) + x1;
-            CF2_Fixed  y2 = cf2_stack_getReal( opStack, idx + 3 ) + y1;
-            CF2_Fixed  x3 = cf2_stack_getReal( opStack, idx + 4 ) + x2;
-            CF2_Fixed  y3 = cf2_stack_getReal( opStack, idx + 5 ) + y2;
-
-
-            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
-
-            curX  = x3;
-            curY  = y3;
-            idx  += 6;
-          }
-
-          cf2_stack_clear( opStack );
-        }
-        continue; /* no need to clear stack again */
-
-      case cf2_cmdVVCURVETO:
-        {
-          CF2_UInt  count, count1 = cf2_stack_count( opStack );
-          CF2_UInt  idx = 0;
-
-
-          /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */
-          /* we enforce it by clearing the second bit           */
-          /* (and sorting the stack indexing to suit)           */
-          count = count1 & ~2U;
-          idx  += count1 - count;
-
-          FT_TRACE4(( " vvcurveto\n" ));
-
-          while ( idx < count )
-          {
-            CF2_Fixed  x1, y1, x2, y2, x3, y3;
-
-
-            if ( ( count - idx ) & 1 )
-            {
-              x1 = cf2_stack_getReal( opStack, idx ) + curX;
-
-              idx++;
-            }
-            else
-              x1 = curX;
-
-            y1 = cf2_stack_getReal( opStack, idx + 0 ) + curY;
-            x2 = cf2_stack_getReal( opStack, idx + 1 ) + x1;
-            y2 = cf2_stack_getReal( opStack, idx + 2 ) + y1;
-            x3 = x2;
-            y3 = cf2_stack_getReal( opStack, idx + 3 ) + y2;
-
-            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
-
-            curX  = x3;
-            curY  = y3;
-            idx  += 4;
-          }
-
-          cf2_stack_clear( opStack );
-        }
-        continue; /* no need to clear stack again */
-
-      case cf2_cmdHHCURVETO:
-        {
-          CF2_UInt  count, count1 = cf2_stack_count( opStack );
-          CF2_UInt  idx = 0;
-
-
-          /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */
-          /* we enforce it by clearing the second bit           */
-          /* (and sorting the stack indexing to suit)           */
-          count = count1 & ~2U;
-          idx  += count1 - count;
-
-          FT_TRACE4(( " hhcurveto\n" ));
-
-          while ( idx < count )
-          {
-            CF2_Fixed  x1, y1, x2, y2, x3, y3;
-
-
-            if ( ( count - idx ) & 1 )
-            {
-              y1 = cf2_stack_getReal( opStack, idx ) + curY;
-
-              idx++;
-            }
-            else
-              y1 = curY;
-
-            x1 = cf2_stack_getReal( opStack, idx + 0 ) + curX;
-            x2 = cf2_stack_getReal( opStack, idx + 1 ) + x1;
-            y2 = cf2_stack_getReal( opStack, idx + 2 ) + y1;
-            x3 = cf2_stack_getReal( opStack, idx + 3 ) + x2;
-            y3 = y2;
-
-            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
-
-            curX  = x3;
-            curY  = y3;
-            idx  += 4;
-          }
-
-          cf2_stack_clear( opStack );
-        }
-        continue; /* no need to clear stack again */
-
-      case cf2_cmdVHCURVETO:
-      case cf2_cmdHVCURVETO:
-        {
-          CF2_UInt  count, count1 = cf2_stack_count( opStack );
-          CF2_UInt  idx = 0;
-
-          FT_Bool  alternate = FT_BOOL( op1 == cf2_cmdHVCURVETO );
-
-
-          /* if `cf2_stack_count' isn't of the form 8n, 8n+1, */
-          /* 8n+4, or 8n+5, we enforce it by clearing the     */
-          /* second bit                                       */
-          /* (and sorting the stack indexing to suit)         */
-          count = count1 & ~2U;
-          idx  += count1 - count;
-
-          FT_TRACE4(( alternate ? " hvcurveto\n" : " vhcurveto\n" ));
-
-          while ( idx < count )
-          {
-            CF2_Fixed x1, x2, x3, y1, y2, y3;
-
-
-            if ( alternate )
-            {
-              x1 = cf2_stack_getReal( opStack, idx + 0 ) + curX;
-              y1 = curY;
-              x2 = cf2_stack_getReal( opStack, idx + 1 ) + x1;
-              y2 = cf2_stack_getReal( opStack, idx + 2 ) + y1;
-              y3 = cf2_stack_getReal( opStack, idx + 3 ) + y2;
-
-              if ( count - idx == 5 )
-              {
-                x3 = cf2_stack_getReal( opStack, idx + 4 ) + x2;
-
-                idx++;
-              }
-              else
-                x3 = x2;
-
-              alternate = FALSE;
-            }
-            else
-            {
-              x1 = curX;
-              y1 = cf2_stack_getReal( opStack, idx + 0 ) + curY;
-              x2 = cf2_stack_getReal( opStack, idx + 1 ) + x1;
-              y2 = cf2_stack_getReal( opStack, idx + 2 ) + y1;
-              x3 = cf2_stack_getReal( opStack, idx + 3 ) + x2;
-
-              if ( count - idx == 5 )
-              {
-                y3 = cf2_stack_getReal( opStack, idx + 4 ) + y2;
-
-                idx++;
-              }
-              else
-                y3 = y2;
-
-              alternate = TRUE;
-            }
-
-            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
-
-            curX  = x3;
-            curY  = y3;
-            idx  += 4;
-          }
-
-          cf2_stack_clear( opStack );
-        }
-        continue;     /* no need to clear stack again */
-
-      case cf2_cmdEXTENDEDNMBR:
-        {
-          CF2_Int  v;
-
-          CF2_Int  byte1 = cf2_buf_readByte( charstring );
-          CF2_Int  byte2 = cf2_buf_readByte( charstring );
-
-
-          v = (FT_Short)( ( byte1 << 8 ) |
-                            byte2        );
-
-          FT_TRACE4(( " %d", v ));
-
-          cf2_stack_pushInt( opStack, v );
-        }
-        continue;
-
-      default:
-        /* numbers */
-        {
-          if ( /* op1 >= 32 && */ op1 <= 246 )
-          {
-            CF2_Int  v;
-
-
-            v = op1 - 139;
-
-            FT_TRACE4(( " %d", v ));
-
-            /* -107 .. 107 */
-            cf2_stack_pushInt( opStack, v );
-          }
-
-          else if ( /* op1 >= 247 && */ op1 <= 250 )
-          {
-            CF2_Int  v;
-
-
-            v  = op1;
-            v -= 247;
-            v *= 256;
-            v += cf2_buf_readByte( charstring );
-            v += 108;
-
-            FT_TRACE4(( " %d", v ));
-
-            /* 108 .. 1131 */
-            cf2_stack_pushInt( opStack, v );
-          }
-
-          else if ( /* op1 >= 251 && */ op1 <= 254 )
-          {
-            CF2_Int  v;
-
-
-            v  = op1;
-            v -= 251;
-            v *= 256;
-            v += cf2_buf_readByte( charstring );
-            v  = -v - 108;
-
-            FT_TRACE4(( " %d", v ));
-
-            /* -1131 .. -108 */
-            cf2_stack_pushInt( opStack, v );
-          }
-
-          else /* op1 == 255 */
-          {
-            CF2_Fixed  v;
-
-            FT_UInt32  byte1 = (FT_UInt32)cf2_buf_readByte( charstring );
-            FT_UInt32  byte2 = (FT_UInt32)cf2_buf_readByte( charstring );
-            FT_UInt32  byte3 = (FT_UInt32)cf2_buf_readByte( charstring );
-            FT_UInt32  byte4 = (FT_UInt32)cf2_buf_readByte( charstring );
-
-
-            v = (CF2_Fixed)( ( byte1 << 24 ) |
-                             ( byte2 << 16 ) |
-                             ( byte3 <<  8 ) |
-                               byte4         );
-
-            FT_TRACE4(( " %.5f", v / 65536.0 ));
-
-            cf2_stack_pushFixed( opStack, v );
-          }
-        }
-        continue;   /* don't clear stack */
-
-      } /* end of switch statement checking `op1' */
-
-      cf2_stack_clear( opStack );
-
-    } /* end of main interpreter loop */
-
-    /* we get here if the charstring ends without cf2_cmdENDCHAR */
-    FT_TRACE4(( "cf2_interpT2CharString:"
-                "  charstring ends without ENDCHAR\n" ));
-
-  exit:
-    /* check whether last error seen is also the first one */
-    cf2_setError( error, lastError );
-
-    if ( *error )
-      FT_TRACE4(( "charstring error %d\n", *error ));
-
-    /* free resources from objects we've used */
-    cf2_glyphpath_finalize( &glyphPath );
-    cf2_arrstack_finalize( &vStemHintArray );
-    cf2_arrstack_finalize( &hStemHintArray );
-    cf2_arrstack_finalize( &subrStack );
-    cf2_stack_free( opStack );
-
-    FT_TRACE4(( "\n" ));
-
-    return;
-  }
-
-
-/* END */
index 397f6df..1a755d5 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType OpenType driver component (body only).                      */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 #include "cffload.c"
 #include "cffobjs.c"
 
-#include "cf2arrst.c"
-#include "cf2blues.c"
-#include "cf2error.c"
-#include "cf2font.c"
-#include "cf2ft.c"
-#include "cf2hints.c"
-#include "cf2intrp.c"
-#include "cf2read.c"
-#include "cf2stack.c"
-
-
 /* END */
index 4adce7a..e45ae11 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CFF character mapping table (cmap) support (body).                   */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 7792e04..856a43d 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CFF character mapping table (cmap) support (specification).          */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -19,7 +19,7 @@
 #ifndef CFFCMAP_H_
 #define CFFCMAP_H_
 
-#include "cffobjs.h"
+#include FT_INTERNAL_CFF_OBJECTS_TYPES_H
 
 FT_BEGIN_HEADER
 
index 38bfc2c..df89684 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType font driver implementation (body).                          */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_STREAM_H
 #include FT_INTERNAL_SFNT_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_POSTSCRIPT_PROPS_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 FT_SERVICE_CFF_TABLE_LOAD_H
 
 #include "cffdrivr.h"
 #include "cffgload.h"
 #include "cffload.h"
 #include "cffcmap.h"
 #include "cffparse.h"
+#include "cffobjs.h"
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 #include FT_SERVICE_MULTIPLE_MASTERS_H
@@ -43,7 +47,7 @@
 #include FT_SERVICE_FONT_FORMAT_H
 #include FT_SERVICE_GLYPH_DICT_H
 #include FT_SERVICE_PROPERTIES_H
-#include FT_CFF_DRIVER_H
+#include FT_DRIVER_H
 
 
   /*************************************************************************/
       {
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
         /* no fast retrieval for blended MM fonts without VVAR table */
-        if ( !ttface->is_default_instance                               &&
-             !( ttface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
+        if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
+             !( ttface->variation_support & TT_FACE_FLAG_VAR_VADVANCE )  )
           return FT_THROW( Unimplemented_Feature );
 #endif
 
                                                        &dummy,
                                                        &ah );
 
-          FT_TRACE5(( "  idx %d: advance height %d font units\n",
-                      start + nn, ah ));
+          FT_TRACE5(( "  idx %d: advance height %d font unit%s\n",
+                      start + nn,
+                      ah,
+                      ah == 1 ? "" : "s" ));
           advances[nn] = ah;
         }
       }
       {
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
         /* no fast retrieval for blended MM fonts without HVAR table */
-        if ( !ttface->is_default_instance                               &&
-             !( ttface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
+        if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) &&
+             !( ttface->variation_support & TT_FACE_FLAG_VAR_HADVANCE )  )
           return FT_THROW( Unimplemented_Feature );
 #endif
 
                                                        &dummy,
                                                        &aw );
 
-          FT_TRACE5(( "  idx %d: advance width %d font units\n",
-                      start + nn, aw ));
+          FT_TRACE5(( "  idx %d: advance width %d font unit%s\n",
+                      start + nn,
+                      aw,
+                      aw == 1 ? "" : "s" ));
           advances[nn] = aw;
         }
       }
   }
 
 
+  static FT_Error
+  cff_ps_get_font_extra( CFF_Face          face,
+                         PS_FontExtraRec*  afont_extra )
+  {
+    CFF_Font  cff   = (CFF_Font)face->extra.data;
+    FT_Error  error = FT_Err_Ok;
+
+
+    if ( cff && cff->font_extra == NULL )
+    {
+      CFF_FontRecDict   dict       = &cff->top_font.font_dict;
+      PS_FontExtraRec*  font_extra = NULL;
+      FT_Memory         memory     = face->root.memory;
+      FT_String*        embedded_postscript;
+
+
+      if ( FT_ALLOC( font_extra, sizeof ( *font_extra ) ) )
+        goto Fail;
+
+      font_extra->fs_type = 0U;
+
+      embedded_postscript = cff_index_get_sid_string(
+                              cff,
+                              dict->embedded_postscript );
+      if ( embedded_postscript )
+      {
+        FT_String*  start_fstype;
+        FT_String*  start_def;
+
+
+        /* Identify the XYZ integer in `/FSType XYZ def' substring. */
+        if ( ( start_fstype = ft_strstr( embedded_postscript,
+                                         "/FSType" ) ) != NULL    &&
+             ( start_def = ft_strstr( start_fstype +
+                                        sizeof ( "/FSType" ) - 1,
+                                      "def" ) ) != NULL           )
+        {
+          FT_String*  s;
+
+
+          for ( s = start_fstype + sizeof ( "/FSType" ) - 1;
+                s != start_def;
+                s++ )
+          {
+            if ( *s >= '0' && *s <= '9' )
+            {
+              if ( font_extra->fs_type >= ( FT_USHORT_MAX - 9 ) / 10 )
+              {
+                /* Overflow - ignore the FSType value.  */
+                font_extra->fs_type = 0U;
+                break;
+              }
+
+              font_extra->fs_type *= 10;
+              font_extra->fs_type += (FT_UShort)( *s - '0' );
+            }
+            else if ( *s != ' ' && *s != '\n' && *s != '\r' )
+            {
+              /* Non-whitespace character between `/FSType' and next `def' */
+              /* - ignore the FSType value.                                */
+              font_extra->fs_type = 0U;
+              break;
+            }
+          }
+        }
+      }
+
+      cff->font_extra = font_extra;
+    }
+
+    if ( cff )
+      *afont_extra = *cff->font_extra;
+
+  Fail:
+    return error;
+  }
+
+
   FT_DEFINE_SERVICE_PSINFOREC(
     cff_service_ps_info,
 
     (PS_GetFontInfoFunc)   cff_ps_get_font_info,    /* ps_get_font_info    */
-    (PS_GetFontExtraFunc)  NULL,                    /* ps_get_font_extra   */
+    (PS_GetFontExtraFunc)  cff_ps_get_font_extra,   /* ps_get_font_extra   */
     (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names,  /* ps_has_glyph_names  */
     /* unsupported with CFF fonts */
     (PS_GetFontPrivateFunc)NULL,                    /* ps_get_font_private */
    *  PROPERTY SERVICE
    *
    */
-  static FT_Error
-  cff_property_set( FT_Module    module,         /* CFF_Driver */
-                    const char*  property_name,
-                    const void*  value,
-                    FT_Bool      value_is_string )
-  {
-    FT_Error    error  = FT_Err_Ok;
-    CFF_Driver  driver = (CFF_Driver)module;
-
-#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
-    FT_UNUSED( value_is_string );
-#endif
-
-
-    if ( !ft_strcmp( property_name, "darkening-parameters" ) )
-    {
-      FT_Int*  darken_params;
-      FT_Int   x1, y1, x2, y2, x3, y3, x4, y4;
-
-#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
-      FT_Int   dp[8];
-
-
-      if ( value_is_string )
-      {
-        const char*  s = (const char*)value;
-        char*        ep;
-        int          i;
-
-
-        /* eight comma-separated numbers */
-        for ( i = 0; i < 7; i++ )
-        {
-          dp[i] = (FT_Int)ft_strtol( s, &ep, 10 );
-          if ( *ep != ',' || s == ep )
-            return FT_THROW( Invalid_Argument );
-
-          s = ep + 1;
-        }
-
-        dp[7] = (FT_Int)ft_strtol( s, &ep, 10 );
-        if ( !( *ep == '\0' || *ep == ' ' ) || s == ep )
-          return FT_THROW( Invalid_Argument );
-
-        darken_params = dp;
-      }
-      else
-#endif
-        darken_params = (FT_Int*)value;
-
-      x1 = darken_params[0];
-      y1 = darken_params[1];
-      x2 = darken_params[2];
-      y2 = darken_params[3];
-      x3 = darken_params[4];
-      y3 = darken_params[5];
-      x4 = darken_params[6];
-      y4 = darken_params[7];
-
-      if ( x1 < 0   || x2 < 0   || x3 < 0   || x4 < 0   ||
-           y1 < 0   || y2 < 0   || y3 < 0   || y4 < 0   ||
-           x1 > x2  || x2 > x3  || x3 > x4              ||
-           y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 )
-        return FT_THROW( Invalid_Argument );
-
-      driver->darken_params[0] = x1;
-      driver->darken_params[1] = y1;
-      driver->darken_params[2] = x2;
-      driver->darken_params[3] = y2;
-      driver->darken_params[4] = x3;
-      driver->darken_params[5] = y3;
-      driver->darken_params[6] = x4;
-      driver->darken_params[7] = y4;
-
-      return error;
-    }
-    else if ( !ft_strcmp( property_name, "hinting-engine" ) )
-    {
-#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
-      if ( value_is_string )
-      {
-        const char*  s = (const char*)value;
-
-
-        if ( !ft_strcmp( s, "adobe" ) )
-          driver->hinting_engine = FT_CFF_HINTING_ADOBE;
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-        else if ( !ft_strcmp( s, "freetype" ) )
-          driver->hinting_engine = FT_CFF_HINTING_FREETYPE;
-#endif
-        else
-          return FT_THROW( Invalid_Argument );
-      }
-      else
-#endif
-      {
-        FT_UInt*  hinting_engine = (FT_UInt*)value;
-
-
-        if ( *hinting_engine == FT_CFF_HINTING_ADOBE
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-             || *hinting_engine == FT_CFF_HINTING_FREETYPE
-#endif
-           )
-          driver->hinting_engine = *hinting_engine;
-        else
-          error = FT_ERR( Unimplemented_Feature );
-
-        return error;
-      }
-    }
-    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
-    {
-#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
-      if ( value_is_string )
-      {
-        const char*  s   = (const char*)value;
-        long         nsd = ft_strtol( s, NULL, 10 );
-
-
-        if ( !nsd )
-          driver->no_stem_darkening = FALSE;
-        else
-          driver->no_stem_darkening = TRUE;
-      }
-      else
-#endif
-      {
-        FT_Bool*  no_stem_darkening = (FT_Bool*)value;
-
-
-        driver->no_stem_darkening = *no_stem_darkening;
-      }
-
-      return error;
-    }
-    else if ( !ft_strcmp( property_name, "random-seed" ) )
-    {
-      FT_Int32  random_seed;
-
-
-#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
-      if ( value_is_string )
-      {
-        const char*  s = (const char*)value;
-
-
-        random_seed = (FT_Int32)ft_strtol( s, NULL, 10 );
-      }
-      else
-#endif
-        random_seed = *(FT_Int32*)value;
-
-      if ( random_seed < 0 )
-        random_seed = 0;
-
-      driver->random_seed = random_seed;
-
-      return error;
-    }
-
-    FT_TRACE0(( "cff_property_set: missing property `%s'\n",
-                property_name ));
-    return FT_THROW( Missing_Property );
-  }
-
-
-  static FT_Error
-  cff_property_get( FT_Module    module,         /* CFF_Driver */
-                    const char*  property_name,
-                    const void*  value )
-  {
-    FT_Error    error  = FT_Err_Ok;
-    CFF_Driver  driver = (CFF_Driver)module;
-
-
-    if ( !ft_strcmp( property_name, "darkening-parameters" ) )
-    {
-      FT_Int*  darken_params = driver->darken_params;
-      FT_Int*  val           = (FT_Int*)value;
-
-
-      val[0] = darken_params[0];
-      val[1] = darken_params[1];
-      val[2] = darken_params[2];
-      val[3] = darken_params[3];
-      val[4] = darken_params[4];
-      val[5] = darken_params[5];
-      val[6] = darken_params[6];
-      val[7] = darken_params[7];
-
-      return error;
-    }
-    else if ( !ft_strcmp( property_name, "hinting-engine" ) )
-    {
-      FT_UInt   hinting_engine    = driver->hinting_engine;
-      FT_UInt*  val               = (FT_UInt*)value;
-
-
-      *val = hinting_engine;
-
-      return error;
-    }
-    else if ( !ft_strcmp( property_name, "no-stem-darkening" ) )
-    {
-      FT_Bool   no_stem_darkening = driver->no_stem_darkening;
-      FT_Bool*  val               = (FT_Bool*)value;
-
-
-      *val = no_stem_darkening;
-
-      return error;
-    }
-
-    FT_TRACE0(( "cff_property_get: missing property `%s'\n",
-                property_name ));
-    return FT_THROW( Missing_Property );
-  }
-
 
   FT_DEFINE_SERVICE_PROPERTIESREC(
     cff_service_properties,
 
-    (FT_Properties_SetFunc)cff_property_set,      /* set_property */
-    (FT_Properties_GetFunc)cff_property_get )     /* get_property */
+    (FT_Properties_SetFunc)ps_property_set,      /* set_property */
+    (FT_Properties_GetFunc)ps_property_get )     /* get_property */
 
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
   }
 
 
+  static FT_Error
+  cff_set_instance( CFF_Face  face,
+                    FT_UInt   instance_index )
+  {
+    FT_Service_MultiMasters  mm = (FT_Service_MultiMasters)face->mm;
+
+
+    return mm->set_instance( FT_FACE( face ), instance_index );
+  }
+
+
   FT_DEFINE_SERVICE_MULTIMASTERSREC(
     cff_service_multi_masters,
 
     (FT_Get_MM_Var_Func)    cff_get_mm_var,         /* get_mm_var     */
     (FT_Set_Var_Design_Func)cff_set_var_design,     /* set_var_design */
     (FT_Get_Var_Design_Func)cff_get_var_design,     /* get_var_design */
+    (FT_Set_Instance_Func)  cff_set_instance,       /* set_instance   */
 
     (FT_Get_Var_Blend_Func) cff_get_var_blend,      /* get_var_blend  */
     (FT_Done_Blend_Func)    cff_done_blend          /* done_blend     */
 #endif
 
 
+  /*
+   *  CFFLOAD SERVICE
+   *
+   */
+
+  FT_DEFINE_SERVICE_CFFLOADREC(
+    cff_service_cff_load,
+
+    (FT_Get_Standard_Encoding_Func)cff_get_standard_encoding,
+    (FT_Load_Private_Dict_Func)    cff_load_private_dict,
+    (FT_FD_Select_Get_Func)        cff_fd_select_get,
+    (FT_Blend_Check_Vector_Func)   cff_blend_check_vector,
+    (FT_Blend_Build_Vector_Func)   cff_blend_build_vector
+  )
+
+
   /*************************************************************************/
   /*************************************************************************/
   /*************************************************************************/
 
 #if !defined FT_CONFIG_OPTION_NO_GLYPH_NAMES && \
      defined TT_CONFIG_OPTION_GX_VAR_SUPPORT
-  FT_DEFINE_SERVICEDESCREC9(
+  FT_DEFINE_SERVICEDESCREC10(
     cff_services,
 
     FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CFF,
     FT_SERVICE_ID_GLYPH_DICT,           &CFF_SERVICE_GLYPH_DICT_GET,
     FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,
     FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,
-    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET
+    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET,
+    FT_SERVICE_ID_CFF_LOAD,             &CFF_SERVICE_CFF_LOAD_GET
   )
 #elif !defined FT_CONFIG_OPTION_NO_GLYPH_NAMES
-  FT_DEFINE_SERVICEDESCREC7(
+  FT_DEFINE_SERVICEDESCREC8(
     cff_services,
 
     FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CFF,
     FT_SERVICE_ID_GLYPH_DICT,           &CFF_SERVICE_GLYPH_DICT_GET,
     FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,
     FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,
-    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET
+    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET,
+    FT_SERVICE_ID_CFF_LOAD,             &CFF_SERVICE_CFF_LOAD_GET
   )
 #elif defined TT_CONFIG_OPTION_GX_VAR_SUPPORT
-  FT_DEFINE_SERVICEDESCREC8(
+  FT_DEFINE_SERVICEDESCREC9(
     cff_services,
 
     FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CFF,
     FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
     FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,
     FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,
-    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET
+    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET,
+    FT_SERVICE_ID_CFF_LOAD,             &CFF_SERVICE_CFF_LOAD_GET
   )
 #else
-  FT_DEFINE_SERVICEDESCREC6(
+  FT_DEFINE_SERVICEDESCREC7(
     cff_services,
 
     FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CFF,
     FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET,
     FT_SERVICE_ID_TT_CMAP,              &CFF_SERVICE_GET_CMAP_INFO_GET,
     FT_SERVICE_ID_CID,                  &CFF_SERVICE_CID_INFO_GET,
-    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET
+    FT_SERVICE_ID_PROPERTIES,           &CFF_SERVICE_PROPERTIES_GET,
+    FT_SERVICE_ID_CFF_LOAD,             &CFF_SERVICE_CFF_LOAD_GET
   )
 #endif
 
       FT_MODULE_DRIVER_HAS_HINTER    |
       FT_MODULE_DRIVER_HINTS_LIGHTLY,
 
-      sizeof ( CFF_DriverRec ),
+      sizeof ( PS_DriverRec ),
       "cff",
       0x10000L,
       0x20000L,
index 05381e6..ad7c3ad 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level OpenType driver interface (specification).                */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 40808c1..b2e1bfa 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CFF error codes (specification only).                                */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 9408048..c58471c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType Glyph Loader (body).                                        */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_STREAM_H
 #include FT_INTERNAL_SFNT_H
+#include FT_INTERNAL_CALC_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
 #include FT_OUTLINE_H
-#include FT_CFF_DRIVER_H
+#include FT_DRIVER_H
 
-#include "cffobjs.h"
 #include "cffload.h"
 #include "cffgload.h"
-#include "cf2ft.h"      /* for cf2_decoder_parse_charstrings */
 
 #include "cfferrs.h"
 
 #define FT_COMPONENT  trace_cffgload
 
 
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-
-  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 */
-  };
-
-#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /**********                                                      *********/
-  /**********                                                      *********/
-  /**********             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 = NULL;
-      builder->hints_funcs   = NULL;
-
-      if ( hinting && size )
-      {
-        FT_Size       ftsize   = FT_SIZE( size );
-        CFF_Internal  internal = (CFF_Internal)ftsize->internal->module_data;
-
-
-        if ( 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_ZERO( 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   = FT_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 = FT_THROW( Invalid_File_Format );
-        goto Exit;
-      }
-
-      FT_TRACE3(( "  in subfont %d:\n", fd_index ));
-
-      sub = cff->subfonts[fd_index];
-
-      if ( builder->hints_funcs && size )
-      {
-        FT_Size       ftsize   = FT_SIZE( size );
-        CFF_Internal  internal = (CFF_Internal)ftsize->internal->module_data;
-
-
-        /* for CFFs without subfonts, this value has already been set */
-        builder->hints_globals = (void *)internal->subfonts[fd_index];
-      }
-    }
-
-    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;
-
-    decoder->current_subfont = sub;
-
-  Exit:
-    return error;
-  }
-
-
-  /* check that there is enough space for `count' more points */
-  FT_LOCAL_DEF( FT_Error )
-  cff_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 */
-  FT_LOCAL_DEF( 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;
-
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-      CFF_Driver  driver  = (CFF_Driver)FT_FACE_DRIVER( builder->face );
-
-
-      if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
-      {
-        point->x = x >> 16;
-        point->y = y >> 16;
-      }
-      else
-#endif
-      {
-        /* cf2_decoder_parse_charstrings uses 16.16 coordinates */
-        point->x = x >> 10;
-        point->y = y >> 10;
-      }
-      *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 )
-  cff_builder_add_point1( CFF_Builder*  builder,
-                          FT_Pos        x,
-                          FT_Pos        y )
-  {
-    FT_Error  error;
-
-
-    error = cff_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 FT_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 )
-  cff_builder_start_point( CFF_Builder*  builder,
-                           FT_Pos        x,
-                           FT_Pos        y )
-  {
-    FT_Error  error = FT_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 */
-  FT_LOCAL_DEF( 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 );
-    }
-  }
-
-
-  FT_LOCAL_DEF( 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 (FT_Int)n;
-    }
-
-    return -1;
-  }
-
-
-  FT_LOCAL_DEF( 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  = (FT_ULong)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 );
-    }
-  }
-
-
-  FT_LOCAL_DEF( 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  = (FT_Int)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 );
-    }
-  }
-
-
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-
-  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 FT_THROW( 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 FT_THROW( 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, (FT_UInt)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, 0 );
-      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, (FT_UInt)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, 0 );
-      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.   */
-  /*                                                                       */
-  /*    in_dict         :: Set to 1 if function is called from top or      */
-  /*                       private DICT (needed for Multiple Master CFFs). */
-  /*                                                                       */
-  /* <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_Bool       in_dict )
-  {
-    FT_Error           error;
-    CFF_Decoder_Zone*  zone;
-    FT_Byte*           ip;
-    FT_Byte*           limit;
-    CFF_Builder*       builder = &decoder->builder;
-    FT_Pos             x, y;
-    FT_Fixed*          stack;
-    FT_Int             charstring_type =
-                         decoder->cff->top_font.font_dict.charstring_type;
-    FT_UShort          num_designs =
-                         decoder->cff->top_font.font_dict.num_designs;
-    FT_UShort          num_axes =
-                         decoder->cff->top_font.font_dict.num_axes;
-
-    T2_Hints_Funcs     hinter;
-
-
-    /* set default width */
-    decoder->num_hints  = 0;
-    decoder->read_width = 1;
-
-    /* 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 = FT_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 we use shifts, all computations are done with unsigned */
-        /* values; the conversion to a signed value is the last step */
-        if ( v == 28 )
-        {
-          if ( ip + 1 >= limit )
-            goto Syntax_Error;
-          val = (FT_Short)( ( (FT_UShort)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)( ( (FT_UInt32)ip[0] << 24 ) |
-                            ( (FT_UInt32)ip[1] << 16 ) |
-                            ( (FT_UInt32)ip[2] <<  8 ) |
-                              (FT_UInt32)ip[3]         );
-          ip    += 4;
-          if ( charstring_type == 2 )
-            shift = 0;
-        }
-        if ( decoder->top - stack >= CFF_MAX_OPERANDS )
-          goto Stack_Overflow;
-
-        val             = (FT_Int32)( (FT_UInt32)val << shift );
-        *decoder->top++ = val;
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-        if ( !( val & 0xFFFFL ) )
-          FT_TRACE4(( " %hd", (FT_Short)( (FT_UInt32)val >> 16 ) ));
-        else
-          FT_TRACE4(( " %.5f", 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;
-
-        /* in Multiple Master CFFs, T2 charstrings can appear in */
-        /* dictionaries, but some operators are prohibited       */
-        if ( in_dict )
-        {
-          switch ( op )
-          {
-          case cff_op_hstem:
-          case cff_op_vstem:
-          case cff_op_vmoveto:
-          case cff_op_rlineto:
-          case cff_op_hlineto:
-          case cff_op_vlineto:
-          case cff_op_rrcurveto:
-          case cff_op_hstemhm:
-          case cff_op_hintmask:
-          case cff_op_cntrmask:
-          case cff_op_rmoveto:
-          case cff_op_hmoveto:
-          case cff_op_vstemhm:
-          case cff_op_rcurveline:
-          case cff_op_rlinecurve:
-          case cff_op_vvcurveto:
-          case cff_op_hhcurveto:
-          case cff_op_vhcurveto:
-          case cff_op_hvcurveto:
-          case cff_op_hflex:
-          case cff_op_flex:
-          case cff_op_hflex1:
-          case cff_op_flex1:
-          case cff_op_callsubr:
-          case cff_op_callgsubr:
-            goto MM_Error;
-
-          default:
-            break;
-          }
-        }
-
-        /* 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 = in_dict
-                               ? 0
-                               : ( ( 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,
-                                (FT_UInt)builder->current->n_points,
-                                (FT_UInt)decoder->num_hints,
-                                ip );
-            else
-              hinter->counter( hinter->hints,
-                               (FT_UInt)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 )  ||
-               cff_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 ) ||
-                 cff_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 ) ||
-                 cff_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 ( cff_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 ( cff_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 ( cff_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 )   ||
-                 cff_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 )        ||
-                 cff_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 ) ||
-                 cff_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 ) ||
-                 cff_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 ) ||
-                 cff_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 ) ||
-                 cff_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:
-          /* in dictionaries, `endchar' simply indicates end of data */
-          if ( in_dict )
-            return error;
-
-          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
-          {
-            cff_builder_close_contour( builder );
-
-            /* close hints recording session */
-            if ( hinter )
-            {
-              if ( hinter->close( hinter->hints,
-                                  (FT_UInt)builder->current->n_points ) )
-                goto Syntax_Error;
-
-              /* apply hints to the loaded glyph outline now */
-              error = hinter->apply( hinter->hints,
-                                     builder->current,
-                                     (PSH_Globals)builder->hints_globals,
-                                     decoder->hint_mode );
-              if ( error )
-                goto Fail;
-            }
-
-            /* 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_TRACE4(( " random\n" ));
-
-          /* only use the lower 16 bits of `random'  */
-          /* to generate a number in the range (0;1] */
-          args[0] = (FT_Fixed)
-                      ( ( decoder->current_subfont->random & 0xFFFF ) + 1 );
-          args++;
-
-          decoder->current_subfont->random =
-            cff_random( decoder->current_subfont->random );
-          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_Fixed  root = args[0];
-            FT_Fixed  new_root;
-
-
-            for (;;)
-            {
-              new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1;
-              if ( new_root == root )
-                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" ));
-
-            /* the Type2 specification before version 16-March-2000 */
-            /* didn't give a hard-coded size limit of the temporary */
-            /* storage array; instead, an argument of the           */
-            /* `MultipleMaster' operator set the size               */
-            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:
-          /* this operator was removed from the Type2 specification */
-          /* in version 16-March-2000                               */
-
-          /* since we currently don't handle interpolation of multiple */
-          /* master fonts, this is a no-op                             */
-          FT_TRACE4(( " store\n"));
-          break;
-
-        case cff_op_load:
-          /* this operator was removed from the Type2 specification */
-          /* in version 16-March-2000                               */
-          {
-            FT_Int  reg_idx = (FT_Int)args[0];
-            FT_Int  idx     = (FT_Int)args[1];
-            FT_Int  count   = (FT_Int)args[2];
-
-
-            FT_TRACE4(( " load\n" ));
-
-            /* since we currently don't handle interpolation of multiple */
-            /* master fonts, we store a vector [1 0 0 ...] in the        */
-            /* temporary storage array regardless of the Registry index  */
-            if ( reg_idx >= 0 && reg_idx <= 2             &&
-                 idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS &&
-                 count >= 0 && count <= num_axes          )
-            {
-              FT_Int  end, i;
-
-
-              end = FT_MIN( idx + count, CFF_MAX_TRANS_ELEMENTS );
-
-              if ( idx < end )
-                decoder->buildchar[idx] = 1 << 16;
-
-              for ( i = idx + 1; i < end; i++ )
-                decoder->buildchar[i] = 0;
-            }
-          }
-          break;
-
-        case cff_op_blend:
-          /* this operator was removed from the Type2 specification */
-          /* in version 16-March-2000                               */
-          {
-            FT_Int  num_results = (FT_Int)( args[0] >> 16 );
-
-
-            FT_TRACE4(( " blend\n" ));
-
-            if ( num_results < 0 )
-              goto Syntax_Error;
-
-            if ( num_results * (FT_Int)num_designs > num_args )
-              goto Stack_Underflow;
-
-            /* since we currently don't handle interpolation of multiple */
-            /* master fonts, return the `num_results' values of the      */
-            /* first master                                              */
-            args     -= num_results * ( num_designs - 1 );
-            num_args -= num_results * ( num_designs - 1 );
-          }
-          break;
-
-        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_not:
-          {
-            FT_Fixed  cond = !args[0];
-
-
-            FT_TRACE4(( " not\n" ));
-
-            args[0] = cond ? 0x10000L : 0;
-            args++;
-          }
-          break;
-
-        case cff_op_eq:
-          {
-            FT_Fixed  cond = ( args[0] == args[1] );
-
-
-            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 (idx %d, entering level %d)\n",
-                        idx,
-                        zone - decoder->zones + 1 ));
-
-            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 (idx %d, entering level %d)\n",
-                        idx,
-                        zone - decoder->zones + 1 ));
-
-            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 (leaving level %d)\n",
-                      decoder->zone - decoder->zones ));
+  FT_LOCAL_DEF( 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 );
 
-          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;
+      *pointer = (FT_Byte*)data.pointer;
+      *length  = (FT_ULong)data.length;
 
-        default:
-          FT_ERROR(( "Unimplemented opcode: %d", ip[-1] ));
+      return error;
+    }
+    else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
 
-          if ( ip[-1] == 12 )
-            FT_ERROR(( " %d", ip[0] ));
-          FT_ERROR(( "\n" ));
+    {
+      CFF_Font  cff = (CFF_Font)(face->extra.data);
 
-          return FT_THROW( Unimplemented_Feature );
-        }
 
-        decoder->top = args;
+      return cff_index_access_element( &cff->charstrings_index, glyph_index,
+                                       pointer, length );
+    }
+  }
 
-        if ( decoder->top - stack >= CFF_MAX_OPERANDS )
-          goto Stack_Overflow;
 
-      } /* general operator processing */
+  FT_LOCAL_DEF( void )
+  cff_free_glyph_data( TT_Face    face,
+                       FT_Byte**  pointer,
+                       FT_ULong   length )
+  {
+#ifndef FT_CONFIG_OPTION_INCREMENTAL
+    FT_UNUSED( length );
+#endif
 
-    } /* while ip < limit */
+#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_TRACE4(( "..end..\n\n" ));
 
-  Fail:
-    return error;
+      data.pointer = *pointer;
+      data.length  = (FT_Int)length;
 
-  MM_Error:
-    FT_TRACE4(( "cff_decoder_parse_charstrings:"
-                " invalid opcode found in top DICT charstring\n"));
-    return FT_THROW( Invalid_File_Format );
+      face->root.internal->incremental_interface->funcs->free_glyph_data(
+        face->root.internal->incremental_interface->object, &data );
+    }
+    else
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
 
-  Syntax_Error:
-    FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" ));
-    return FT_THROW( Invalid_File_Format );
+    {
+      CFF_Font  cff = (CFF_Font)(face->extra.data);
 
-  Stack_Underflow:
-    FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" ));
-    return FT_THROW( Too_Few_Arguments );
 
-  Stack_Overflow:
-    FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" ));
-    return FT_THROW( Stack_Overflow );
+      cff_index_forget_element( &cff->charstrings_index, pointer );
+    }
   }
 
-#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
-
 
   /*************************************************************************/
   /*************************************************************************/
     FT_Int       glyph_index;
     CFF_Font     cff = (CFF_Font)face->other;
 
+    PSAux_Service            psaux         = (PSAux_Service)face->psaux;
+    const CFF_Decoder_Funcs  decoder_funcs = psaux->cff_decoder_funcs;
+
 
     *max_advance = 0;
 
     /* Initialize load decoder */
-    cff_decoder_init( &decoder, face, 0, 0, 0, 0 );
+    decoder_funcs->init( &decoder, face, 0, 0, 0, 0, 0, 0 );
 
     decoder.builder.metrics_only = 1;
     decoder.builder.load_points  = 0;
                                   &charstring, &charstring_len );
       if ( !error )
       {
-        error = cff_decoder_prepare( &decoder, size, glyph_index );
+        error = decoder_funcs->prepare( &decoder, size, glyph_index );
         if ( !error )
-          error = cff_decoder_parse_charstrings( &decoder,
-                                                 charstring,
-                                                 charstring_len,
-                                                 0 );
+          error = decoder_funcs->parse_charstrings_old( &decoder,
+                                                        charstring,
+                                                        charstring_len,
+                                                        0 );
 
         cff_free_glyph_data( face, &charstring, &charstring_len );
       }
   {
     FT_Error     error;
     CFF_Decoder  decoder;
+    PS_Decoder   psdecoder;
     TT_Face      face = (TT_Face)glyph->root.face;
     FT_Bool      hinting, scaled, force_scaling;
     CFF_Font     cff  = (CFF_Font)face->extra.data;
 
+    PSAux_Service            psaux         = (PSAux_Service)face->psaux;
+    const CFF_Decoder_Funcs  decoder_funcs = psaux->cff_decoder_funcs;
+
     FT_Matrix    font_matrix;
     FT_Vector    font_offset;
 
 
     {
 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-      CFF_Driver  driver = (CFF_Driver)FT_FACE_DRIVER( face );
+      PS_Driver  driver = (PS_Driver)FT_FACE_DRIVER( face );
 #endif
 
 
       FT_ULong  charstring_len;
 
 
-      cff_decoder_init( &decoder, face, size, glyph, hinting,
-                        FT_LOAD_TARGET_MODE( load_flags ) );
+      decoder_funcs->init( &decoder, face, size, glyph, hinting,
+                           FT_LOAD_TARGET_MODE( load_flags ),
+                           cff_get_glyph_data,
+                           cff_free_glyph_data );
 
       /* this is for pure CFFs */
       if ( load_flags & FT_LOAD_ADVANCE_ONLY )
       if ( error )
         goto Glyph_Build_Finished;
 
-      error = cff_decoder_prepare( &decoder, size, glyph_index );
+      error = decoder_funcs->prepare( &decoder, size, glyph_index );
       if ( error )
         goto Glyph_Build_Finished;
 
 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
       /* choose which CFF renderer to use */
-      if ( driver->hinting_engine == FT_CFF_HINTING_FREETYPE )
-        error = cff_decoder_parse_charstrings( &decoder,
-                                               charstring,
-                                               charstring_len,
-                                               0 );
+      if ( driver->hinting_engine == FT_HINTING_FREETYPE )
+        error = decoder_funcs->parse_charstrings_old( &decoder,
+                                                      charstring,
+                                                      charstring_len,
+                                                      0 );
       else
 #endif
       {
-        error = cf2_decoder_parse_charstrings( &decoder,
-                                               charstring,
-                                               charstring_len );
+        psaux->ps_decoder_init( &psdecoder, &decoder, FALSE );
+
+        error = decoder_funcs->parse_charstrings( &psdecoder,
+                                                  charstring,
+                                                  charstring_len );
 
         /* Adobe's engine uses 16.16 numbers everywhere;              */
         /* as a consequence, glyphs larger than 2000ppem get rejected */
           force_scaling = TRUE;
           glyph->hint   = hinting;
 
-          error = cf2_decoder_parse_charstrings( &decoder,
-                                                 charstring,
-                                                 charstring_len );
+          error = decoder_funcs->parse_charstrings( &psdecoder,
+                                                    charstring,
+                                                    charstring_len );
         }
       }
 
   Glyph_Build_Finished:
       /* save new glyph tables, if no error */
       if ( !error )
-        cff_builder_done( &decoder.builder );
+        decoder.builder.funcs.done( &decoder.builder );
       /* XXX: anything to do for broken glyph entry? */
     }
 
index 0fa93b4..803f397 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType Glyph Loader (specification).                               */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
-#include "cffobjs.h"
+#include FT_INTERNAL_CFF_OBJECTS_TYPES_H
 
 
 FT_BEGIN_HEADER
 
-
-#define CFF_MAX_OPERANDS        48
-#define CFF_MAX_SUBRS_CALLS     16  /* maximum subroutine nesting;         */
-                                    /* only 10 are allowed but there exist */
-                                    /* fonts like `HiraKakuProN-W3.ttf'    */
-                                    /* (Hiragino Kaku Gothic ProN W3;      */
-                                    /* 8.2d6e1; 2014-12-19) that exceed    */
-                                    /* this limit                          */
-#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;
-
-
-  FT_LOCAL( FT_Error )
-  cff_check_points( CFF_Builder*  builder,
-                    FT_Int        count );
-
-  FT_LOCAL( void )
-  cff_builder_add_point( CFF_Builder*  builder,
-                         FT_Pos        x,
-                         FT_Pos        y,
-                         FT_Byte       flag );
-  FT_LOCAL( FT_Error )
-  cff_builder_add_point1( CFF_Builder*  builder,
-                          FT_Pos        x,
-                          FT_Pos        y );
-  FT_LOCAL( FT_Error )
-  cff_builder_start_point( CFF_Builder*  builder,
-                           FT_Pos        x,
-                           FT_Pos        y );
-  FT_LOCAL( void )
-  cff_builder_close_contour( CFF_Builder*  builder );
-
-
-  FT_LOCAL( FT_Int )
-  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,
-                                   FT_Int    charcode );
   FT_LOCAL( FT_Error )
   cff_get_glyph_data( TT_Face    face,
                       FT_UInt    glyph_index,
@@ -146,74 +38,6 @@ FT_BEGIN_HEADER
                        FT_ULong   length );
 
 
-  /* 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_SubFont        current_subfont; /* for current glyph_index */
-
-  } 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 */
@@ -223,13 +47,6 @@ FT_BEGIN_HEADER
 
 #endif /* 0 */
 
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-  FT_LOCAL( FT_Error )
-  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,
-                                 FT_Byte*      charstring_base,
-                                 FT_ULong      charstring_len,
-                                 FT_Bool       in_dict );
-#endif
 
   FT_LOCAL( FT_Error )
   cff_slot_load( CFF_GlyphSlot  glyph,
index 3beaeb1..ba49793 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType and CFF data/program tables loader (body).                  */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,6 +22,7 @@
 #include FT_INTERNAL_STREAM_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_TYPE1_TABLES_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 #include FT_MULTIPLE_MASTERS_H
 
     if ( numOperands > count )
     {
-      FT_TRACE4(( " cff_blend_doBlend: Stack underflow %d args\n", count ));
+      FT_TRACE4(( " cff_blend_doBlend: Stack underflow %d argument%s\n",
+                  count,
+                  count == 1 ? "" : "s" ));
 
       error = FT_THROW( Stack_Underflow );
       goto Exit;
     for ( i = 0; i < numBlends; i++ )
     {
       const FT_Int32*  weight = &blend->BV[1];
-      FT_Int32         sum;
+      FT_UInt32        sum;
 
 
       /* convert inputs to 16.16 fixed point */
-      sum = cff_parse_num( parser, &parser->stack[i + base] ) * 65536;
+      sum = cff_parse_num( parser, &parser->stack[i + base] ) * 0x10000;
 
       for ( j = 1; j < blend->lenBV; j++ )
-        sum += FT_MulFix( *weight++,
-                          cff_parse_num( parser,
-                                         &parser->stack[delta++] ) * 65536 );
+        sum += cff_parse_num( parser, &parser->stack[delta++] ) * *weight++;
 
       /* point parser stack to new value on blend_stack */
       parser->stack[i + base] = subFont->blend_top;
       /* opcode in both CFF and CFF2 DICTs.  See `cff_parse_num' for    */
       /* decode of this, which rounds to an integer.                    */
       *subFont->blend_top++ = 255;
-      *subFont->blend_top++ = ( (FT_UInt32)sum & 0xFF000000U ) >> 24;
-      *subFont->blend_top++ = ( (FT_UInt32)sum & 0x00FF0000U ) >> 16;
-      *subFont->blend_top++ = ( (FT_UInt32)sum & 0x0000FF00U ) >>  8;
-      *subFont->blend_top++ =   (FT_UInt32)sum & 0x000000FFU;
+      *subFont->blend_top++ = (FT_Byte)( sum >> 24 );
+      *subFont->blend_top++ = (FT_Byte)( sum >> 16 );
+      *subFont->blend_top++ = (FT_Byte)( sum >>  8 );
+      *subFont->blend_top++ = (FT_Byte)sum;
     }
 
     /* leave only numBlends results on parser stack */
                           FT_UInt    lenNDV,
                           FT_Fixed*  NDV )
   {
-    if ( !blend->builtBV                             ||
-         blend->lastVsindex != vsindex               ||
-         blend->lenNDV != lenNDV                     ||
-         ( lenNDV                                  &&
-           memcmp( NDV,
-                   blend->lastNDV,
-                   lenNDV * sizeof ( *NDV ) ) != 0 ) )
+    if ( !blend->builtBV                                ||
+         blend->lastVsindex != vsindex                  ||
+         blend->lenNDV != lenNDV                        ||
+         ( lenNDV                                     &&
+           ft_memcmp( NDV,
+                      blend->lastNDV,
+                      lenNDV * sizeof ( *NDV ) ) != 0 ) )
     {
       /* need to build blend vector */
       return TRUE;
     FT_Service_MultiMasters  mm = (FT_Service_MultiMasters)face->mm;
 
 
-    mm->done_blend( FT_FACE( face ) );
+    if (mm)
+      mm->done_blend( FT_FACE( face ) );
   }
 
 #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
   }
 
 
-  FT_LOCAL_DEF( FT_UInt32 )
-  cff_random( FT_UInt32  r )
-  {
-    /* a 32bit version of the `xorshift' algorithm */
-    r ^= r << 13;
-    r ^= r >> 17;
-    r ^= r << 5;
-
-    return r;
-  }
-
-
   /* There are 3 ways to call this function, distinguished by code.  */
   /*                                                                 */
   /* . CFF_CODE_TOPDICT for either a CFF Top DICT or a CFF Font DICT */
     CFF_FontRecDict  top  = &subfont->font_dict;
     CFF_Private      priv = &subfont->private_dict;
 
+    PSAux_Service  psaux = (PSAux_Service)face->psaux;
+
     FT_Bool  cff2      = FT_BOOL( code == CFF2_CODE_TOPDICT  ||
                                   code == CFF2_CODE_FONTDICT );
     FT_UInt  stackSize = cff2 ? CFF2_DEFAULT_STACK
        */
       if ( face->root.internal->random_seed == -1 )
       {
-        CFF_Driver  driver = (CFF_Driver)FT_FACE_DRIVER( face );
+        PS_Driver  driver = (PS_Driver)FT_FACE_DRIVER( face );
 
 
         subfont->random = (FT_UInt32)driver->random_seed;
           do
           {
             driver->random_seed =
-              (FT_Int32)cff_random( (FT_UInt32)driver->random_seed );
+              (FT_Int32)psaux->cff_random( (FT_UInt32)driver->random_seed );
 
           } while ( driver->random_seed < 0 );
         }
           do
           {
             face->root.internal->random_seed =
-              (FT_Int32)cff_random( (FT_UInt32)face->root.internal->random_seed );
+              (FT_Int32)psaux->cff_random(
+                (FT_UInt32)face->root.internal->random_seed );
 
           } while ( face->root.internal->random_seed < 0 );
         }
       font->cf2_instance.finalizer( font->cf2_instance.data );
       FT_FREE( font->cf2_instance.data );
     }
+
+    FT_FREE( font->font_extra );
   }
 
 
index c745e81..14d14e2 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType & CFF data/program tables loader (specification).           */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -21,9 +21,9 @@
 
 
 #include <ft2build.h>
-#include "cfftypes.h"
+#include FT_INTERNAL_CFF_TYPES_H
 #include "cffparse.h"
-#include "cffobjs.h"  /* for CFF_Face */
+#include FT_INTERNAL_CFF_OBJECTS_TYPES_H  /* for CFF_Face */
 
 
 FT_BEGIN_HEADER
@@ -61,9 +61,6 @@ FT_BEGIN_HEADER
                              FT_UInt      cid );
 
 
-  FT_LOCAL( FT_UInt32 )
-  cff_random( FT_UInt32  r );
-
   FT_LOCAL( FT_Error )
   cff_font_load( FT_Library  library,
                  FT_Stream   stream,
index 6161393..a2d7aec 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType objects manager (body).                                     */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 #include FT_TRUETYPE_IDS_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_INTERNAL_SFNT_H
-#include FT_CFF_DRIVER_H
+#include FT_DRIVER_H
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 #include FT_MULTIPLE_MASTERS_H
 #include FT_SERVICE_MULTIPLE_MASTERS_H
+#include FT_SERVICE_METRICS_VARIATIONS_H
 #endif
 
+#include FT_INTERNAL_CFF_OBJECTS_TYPES_H
 #include "cffobjs.h"
 #include "cffload.h"
 #include "cffcmap.h"
@@ -39,6 +41,9 @@
 
 #include "cfferrs.h"
 
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_SERVICE_CFF_TABLE_LOAD_H
+
 
   /*************************************************************************/
   /*                                                                       */
   remove_subset_prefix( FT_String*  name )
   {
     FT_Int32  idx             = 0;
-    FT_Int32  length          = (FT_Int32)strlen( name ) + 1;
+    FT_Int32  length          = (FT_Int32)ft_strlen( name ) + 1;
     FT_Bool   continue_search = 1;
 
 
     FT_Int32  family_name_length, style_name_length;
 
 
-    family_name_length = (FT_Int32)strlen( family_name );
-    style_name_length  = (FT_Int32)strlen( style_name );
+    family_name_length = (FT_Int32)ft_strlen( family_name );
+    style_name_length  = (FT_Int32)ft_strlen( style_name );
 
     if ( family_name_length > style_name_length )
     {
     SFNT_Service        sfnt;
     FT_Service_PsCMaps  psnames;
     PSHinter_Service    pshinter;
+    PSAux_Service       psaux;
+    FT_Service_CFFLoad  cffload;
     FT_Bool             pure_cff    = 1;
     FT_Bool             cff2        = 0;
     FT_Bool             sfnt_format = 0;
     FT_Library          library     = cffface->driver->root.library;
 
 
-    sfnt = (SFNT_Service)FT_Get_Module_Interface(
-             library, "sfnt" );
+    sfnt = (SFNT_Service)FT_Get_Module_Interface( library,
+                                                  "sfnt" );
     if ( !sfnt )
     {
       FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" ));
 
     FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
 
-    pshinter = (PSHinter_Service)FT_Get_Module_Interface(
-                 library, "pshinter" );
+    pshinter = (PSHinter_Service)FT_Get_Module_Interface( library,
+                                                          "pshinter" );
+
+    psaux = (PSAux_Service)FT_Get_Module_Interface( library,
+                                                    "psaux" );
+    if ( !psaux )
+    {
+      FT_ERROR(( "cff_face_init: cannot access `psaux' module\n" ));
+      error = FT_THROW( Missing_Module );
+      goto Exit;
+    }
+    face->psaux = psaux;
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, cffload, CFF_LOAD );
 
     FT_TRACE2(( "CFF driver\n" ));
 
 
       cff->pshinter = pshinter;
       cff->psnames  = psnames;
+      cff->cffload  = cffload;
 
       cffface->face_index = face_index & 0xFFFF;
 
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
       {
-        FT_Service_MultiMasters  mm = (FT_Service_MultiMasters)face->mm;
+        FT_Service_MultiMasters       mm  = (FT_Service_MultiMasters)face->mm;
+        FT_Service_MetricsVariations  var = (FT_Service_MetricsVariations)face->var;
 
-        FT_Int  instance_index = face_index >> 16;
+        FT_UInt  instance_index = (FT_UInt)face_index >> 16;
 
 
         if ( FT_HAS_MULTIPLE_MASTERS( cffface ) &&
              mm                                 &&
              instance_index > 0                 )
         {
-          FT_MM_Var*  mm_var;
-
-
-          error = mm->get_mm_var( cffface, NULL );
+          error = mm->set_instance( cffface, instance_index );
           if ( error )
             goto Exit;
 
-          mm->get_var_blend( cffface, NULL, NULL, NULL, &mm_var );
-
-          if ( mm_var->namedstyle )
-          {
-            FT_Var_Named_Style*  named_style;
-            FT_String*           style_name;
-
-
-            /* in `face_index', the instance index starts with value 1 */
-            named_style = mm_var->namedstyle + instance_index - 1;
-            error = sfnt->get_name( face,
-                                    (FT_UShort)named_style->strid,
-                                    &style_name );
-            if ( error )
-              goto Exit;
-
-            /* set style name; if already set, replace it */
-            if ( face->root.style_name )
-              FT_FREE( face->root.style_name );
-            face->root.style_name = style_name;
-
-            /* finally, select the named instance */
-            error = mm->set_var_design( cffface,
-                                        mm_var->num_axis,
-                                        named_style->coords );
-            if ( error )
-              goto Exit;
-          }
+          if ( var )
+            var->metrics_adjust( cffface );
         }
       }
 #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
 
         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->height = (FT_Short)( cffface->ascender -
+                                        cffface->descender );
 
         cffface->underline_position  =
           (FT_Short)( dict->underline_position >> 16 );
           (FT_Short)( dict->underline_thickness >> 16 );
 
         /* retrieve font family & style name */
-        cffface->family_name = cff_index_get_name(
-                                 cff,
-                                 (FT_UInt)( face_index & 0xFFFF ) );
+        if ( dict->family_name )
+        {
+          char*  family_name;
+
+
+          family_name = cff_index_get_sid_string( cff, dict->family_name );
+          if ( family_name )
+            cffface->family_name = cff_strcpy( memory, family_name );
+        }
+
+        if ( !cffface->family_name )
+        {
+          cffface->family_name = cff_index_get_name(
+                                   cff,
+                                   (FT_UInt)( face_index & 0xFFFF ) );
+          if ( cffface->family_name )
+            remove_subset_prefix( cffface->family_name );
+        }
+
         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. */
   FT_LOCAL_DEF( FT_Error )
   cff_driver_init( FT_Module  module )        /* CFF_Driver */
   {
-    CFF_Driver  driver = (CFF_Driver)module;
+    PS_Driver  driver = (PS_Driver)module;
 
     FT_UInt32  seed;
 
 
     /* set default property values, cf. `ftcffdrv.h' */
 #ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-    driver->hinting_engine = FT_CFF_HINTING_FREETYPE;
+    driver->hinting_engine = FT_HINTING_FREETYPE;
 #else
-    driver->hinting_engine = FT_CFF_HINTING_ADOBE;
+    driver->hinting_engine = FT_HINTING_ADOBE;
 #endif
 
     driver->no_stem_darkening = TRUE;
index 1dba694..616a25b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType objects manager (specification).                            */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 
 
 #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;
-
-
-  /***********************************************************************/
-  /*                                                                     */
-  /* CFF driver class.                                                   */
-  /*                                                                     */
-  typedef struct  CFF_DriverRec_
-  {
-    FT_DriverRec  root;
-
-    FT_UInt   hinting_engine;
-    FT_Bool   no_stem_darkening;
-    FT_Int    darken_params[8];
-    FT_Int32  random_seed;
-
-  } CFF_DriverRec;
-
-
   FT_LOCAL( FT_Error )
   cff_size_init( FT_Size  size );           /* CFF_Size */
 
@@ -171,10 +71,10 @@ FT_BEGIN_HEADER
   /* Driver functions                                                      */
   /*                                                                       */
   FT_LOCAL( FT_Error )
-  cff_driver_init( FT_Module  module );         /* CFF_Driver */
+  cff_driver_init( FT_Module  module );         /* PS_Driver */
 
   FT_LOCAL( void )
-  cff_driver_done( FT_Module  module );         /* CFF_Driver */
+  cff_driver_done( FT_Module  module );         /* PS_Driver */
 
 
 FT_END_HEADER
index e1511bd..b9611cf 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CFF token stream parser (body)                                       */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 #include "cffparse.h"
 #include FT_INTERNAL_STREAM_H
 #include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_CALC_H
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
 
 #include "cfferrs.h"
 #include "cffpic.h"
-#include "cffgload.h"
 #include "cffload.h"
 
 
     1000000000L
   };
 
+  /* maximum values allowed for multiplying      */
+  /* with the corresponding `power_tens' element */
+  static const FT_Long power_ten_limits[] =
+  {
+    FT_LONG_MAX / 1L,
+    FT_LONG_MAX / 10L,
+    FT_LONG_MAX / 100L,
+    FT_LONG_MAX / 1000L,
+    FT_LONG_MAX / 10000L,
+    FT_LONG_MAX / 100000L,
+    FT_LONG_MAX / 1000000L,
+    FT_LONG_MAX / 10000000L,
+    FT_LONG_MAX / 100000000L,
+    FT_LONG_MAX / 1000000000L,
+  };
+
 
   /* read a real */
   static FT_Fixed
 
 
       if ( scaling )
+      {
+        if ( FT_ABS( val ) > power_ten_limits[scaling] )
+        {
+          val = val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL;
+          goto Overflow;
+        }
+
         val *= power_tens[scaling];
+      }
 
       if ( val > 0x7FFF )
       {
       goto Exit;
     }
 
-    FT_TRACE4(( "   %d values blended\n", numBlends ));
+    FT_TRACE4(( "   %d value%s blended\n",
+                numBlends,
+                numBlends == 1 ? "" : "s" ));
 
     error = cff_blend_doBlend( subFont, parser, numBlends );
 
                   FT_Byte*    start,
                   FT_Byte*    limit )
   {
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+    PSAux_Service  psaux;
+#endif
+
     FT_Byte*    p       = start;
     FT_Error    error   = FT_Err_Ok;
     FT_Library  library = parser->library;
+
     FT_UNUSED( library );
 
 
         cff_rec.top_font.font_dict.num_axes    = parser->num_axes;
         decoder.cff                            = &cff_rec;
 
-        error = cff_decoder_parse_charstrings( &decoder,
-                                               charstring_base,
-                                               charstring_len,
-                                               1 );
+        psaux = (PSAux_Service)FT_Get_Module_Interface( library, "psaux" );
+        if ( !psaux )
+        {
+          FT_ERROR(( "cff_parser_run: cannot access `psaux' module\n" ));
+          error = FT_THROW( Missing_Module );
+          goto Exit;
+        }
+
+        error = psaux->cff_decoder_funcs->parse_charstrings_old(
+                  &decoder, charstring_base, charstring_len, 1 );
 
         /* Now copy the stack data in the temporary decoder object,    */
         /* converting it back to charstring number representations     */
                 val = 0;
                 while ( num_args > 0 )
                 {
-                  val += cff_parse_num( parser, data++ );
+                  val = ADD_LONG( val, cff_parse_num( parser, data++ ) );
                   switch ( field->size )
                   {
                   case (8 / FT_CHAR_BIT):
index 83d1bba..8a8caec 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CFF token stream parser (specification)                              */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -21,7 +21,7 @@
 
 
 #include <ft2build.h>
-#include "cfftypes.h"
+#include FT_INTERNAL_CFF_TYPES_H
 #include FT_INTERNAL_OBJECTS_H
 
 
index 4e9ba12..08b74c7 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for cff module.      */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 5db39cd..8ba4203 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for cff module.      */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,7 +22,6 @@
 
 #include FT_INTERNAL_PIC_H
 
-
 #ifndef FT_CONFIG_OPTION_PIC
 
 #define CFF_SERVICE_PS_INFO_GET          cff_service_ps_info
@@ -34,6 +33,7 @@
 #define CFF_SERVICES_GET                 cff_services
 #define CFF_SERVICE_MULTI_MASTERS_GET    cff_service_multi_masters
 #define CFF_SERVICE_METRICS_VAR_GET      cff_service_metrics_variations
+#define CFF_SERVICE_CFF_LOAD_GET         cff_service_cff_load
 #define CFF_CMAP_ENCODING_CLASS_REC_GET  cff_cmap_encoding_class_rec
 #define CFF_CMAP_UNICODE_CLASS_REC_GET   cff_cmap_unicode_class_rec
 #define CFF_FIELD_HANDLERS_GET           cff_field_handlers
@@ -65,6 +65,7 @@ FT_BEGIN_HEADER
     FT_Service_PropertiesRec         cff_service_properties;
     FT_Service_MultiMastersRec       cff_service_multi_masters;
     FT_Service_MetricsVariationsRec  cff_service_metrics_variations;
+    FT_Service_CFFLoadRec            cff_service_cff_load;
     FT_CMap_ClassRec                 cff_cmap_encoding_class_rec;
     FT_CMap_ClassRec                 cff_cmap_unicode_class_rec;
 
@@ -92,6 +93,8 @@ FT_BEGIN_HEADER
           ( GET_PIC( library )->cff_service_multi_masters )
 #define CFF_SERVICE_METRICS_VAR_GET                              \
           ( GET_PIC( library )->cff_service_metrics_variations )
+#define CFF_SERVICE_CFF_LOAD_GET                       \
+          ( GET_PIC( library )->cff_service_cff_load )
 #define CFF_CMAP_ENCODING_CLASS_REC_GET                       \
           ( GET_PIC( library )->cff_cmap_encoding_class_rec )
 #define CFF_CMAP_UNICODE_CLASS_REC_GET                       \
index 3222e93..fec1ca2 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CFF token definitions (specification only).                          */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 2975aee..8013d5d 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 86840bf..bce6729 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -32,27 +32,14 @@ CFF_DRV_SRC := $(CFF_DIR)/cffcmap.c  \
                $(CFF_DIR)/cffload.c  \
                $(CFF_DIR)/cffobjs.c  \
                $(CFF_DIR)/cffparse.c \
-               $(CFF_DIR)/cffpic.c   \
-               $(CFF_DIR)/cf2arrst.c \
-               $(CFF_DIR)/cf2blues.c \
-               $(CFF_DIR)/cf2error.c \
-               $(CFF_DIR)/cf2font.c  \
-               $(CFF_DIR)/cf2ft.c    \
-               $(CFF_DIR)/cf2hints.c \
-               $(CFF_DIR)/cf2intrp.c \
-               $(CFF_DIR)/cf2read.c  \
-               $(CFF_DIR)/cf2stack.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_DIR)/cf2fixed.h  \
-             $(CFF_DIR)/cf2glue.h   \
-             $(CFF_DIR)/cf2types.h
+             $(CFF_DIR)/cfftoken.h
 
 
 # CFF driver object(s)
index 8d3ba6a..1c232fd 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/cid Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 709dc8c..a5a86e3 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID error codes (specification only).                                */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index b96c333..d14f9a2 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID-keyed Type1 Glyph Loader (body).                                 */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 #include FT_OUTLINE_H
 #include FT_INTERNAL_CALC_H
 
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_CFF_TYPES_H
+#include FT_DRIVER_H
+
 #include "ciderrs.h"
 
 
     FT_ULong       glyph_length = 0;
     PSAux_Service  psaux        = (PSAux_Service)face->psaux;
 
+    FT_Bool  force_scaling = FALSE;
+
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
-    FT_Incremental_InterfaceRec *inc =
-                                  face->root.internal->incremental_interface;
+    FT_Incremental_InterfaceRec  *inc =
+                                   face->root.internal->incremental_interface;
 #endif
 
 
       if ( decoder->lenIV >= 0 )
         psaux->t1_decrypt( charstring, glyph_length, 4330 );
 
-      error = decoder->funcs.parse_charstrings(
-                decoder, charstring + cs_offset,
-                glyph_length - cs_offset );
+      /* choose which renderer to use */
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+      if ( ( (PS_Driver)FT_FACE_DRIVER( face ) )->hinting_engine ==
+               FT_HINTING_FREETYPE                                  ||
+           decoder->builder.metrics_only                            )
+        error = psaux->t1_decoder_funcs->parse_charstrings_old(
+                  decoder,
+                  charstring + cs_offset,
+                  glyph_length - cs_offset );
+#else
+      if ( decoder->builder.metrics_only )
+        error = psaux->t1_decoder_funcs->parse_metrics(
+                  decoder,
+                  charstring + cs_offset,
+                  glyph_length - cs_offset );
+#endif
+      else
+      {
+        PS_Decoder      psdecoder;
+        CFF_SubFontRec  subfont;
+
+
+        psaux->ps_decoder_init( &psdecoder, decoder, TRUE );
+
+        psaux->t1_make_subfont( FT_FACE( face ),
+                                &dict->private_dict,
+                                &subfont );
+        psdecoder.current_subfont = &subfont;
+
+        error = psaux->t1_decoder_funcs->parse_charstrings(
+                  &psdecoder,
+                  charstring + cs_offset,
+                  glyph_length - cs_offset );
+
+        /* Adobe's engine uses 16.16 numbers everywhere;              */
+        /* as a consequence, glyphs larger than 2000ppem get rejected */
+        if ( FT_ERR_EQ( error, Glyph_Too_Big ) )
+        {
+          /* this time, we retry unhinted and scale up the glyph later on */
+          /* (the engine uses and sets the hardcoded value 0x10000 / 64 = */
+          /* 0x400 for both `x_scale' and `y_scale' in this case)         */
+          ((CID_GlyphSlot)decoder->builder.glyph)->hint = FALSE;
+
+          force_scaling = TRUE;
+
+          error = psaux->t1_decoder_funcs->parse_charstrings(
+                    &psdecoder,
+                    charstring + cs_offset,
+                    glyph_length - cs_offset );
+        }
+      }
     }
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
   Exit:
     FT_FREE( charstring );
 
+    ((CID_GlyphSlot)decoder->builder.glyph)->scaled = force_scaling;
+
     return error;
   }
 
     T1_DecoderRec  decoder;
     CID_Face       face = (CID_Face)cidglyph->face;
     FT_Bool        hinting;
+    FT_Bool        scaled;
 
     PSAux_Service  psaux = (PSAux_Service)face->psaux;
     FT_Matrix      font_matrix;
     FT_Vector      font_offset;
+    FT_Bool        must_finish_decoder = FALSE;
 
 
     if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
 
     hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&
                        ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+    scaled  = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 );
 
+    glyph->hint      = hinting;
+    glyph->scaled    = scaled;
     cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
 
     error = psaux->t1_decoder_funcs->init( &decoder,
     /* TODO: initialize decoder.len_buildchar and decoder.buildchar */
     /*       if we ever support CID-keyed multiple master fonts     */
 
+    must_finish_decoder = TRUE;
+
     /* set up the decoder */
     decoder.builder.no_recurse = FT_BOOL(
       ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ) );
     if ( error )
       goto Exit;
 
+    /* copy flags back for forced scaling */
+    hinting = glyph->hint;
+    scaled  = glyph->scaled;
+
     font_matrix = decoder.font_matrix;
     font_offset = decoder.font_offset;
 
     /* save new glyph tables */
     psaux->t1_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                                    */
         metrics->vertAdvance += font_offset.y;
       }
 
-      if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
+      if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || scaled )
       {
         /* scale the outline and the metrics */
         FT_Int       n;
     }
 
   Exit:
+
+    if ( must_finish_decoder )
+      psaux->t1_decoder_funcs->done( &decoder );
+
     return error;
   }
 
index 7f816b5..4811852 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType Glyph Loader (specification).                               */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index ff07221..27cd09b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID-keyed Type1 font loader (body).                                  */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 45a0e6d..3f8bd08 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID-keyed Type1 font loader (specification).                         */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index ceda8ff..77afe1c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID objects manager (body).                                          */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -26,6 +26,7 @@
 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
 #include FT_INTERNAL_POSTSCRIPT_AUX_H
 #include FT_INTERNAL_POSTSCRIPT_HINTS_H
+#include FT_DRIVER_H
 
 #include "ciderrs.h"
 
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
   FT_LOCAL_DEF( FT_Error )
-  cid_driver_init( FT_Module  driver )
+  cid_driver_init( FT_Module  module )
   {
-    FT_UNUSED( driver );
+    PS_Driver  driver = (PS_Driver)module;
+
+    FT_UInt32  seed;
+
+
+    /* set default property values, cf. `ftt1drv.h' */
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+    driver->hinting_engine = FT_HINTING_FREETYPE;
+#else
+    driver->hinting_engine = FT_HINTING_ADOBE;
+#endif
+
+    driver->no_stem_darkening = TRUE;
+
+    driver->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1;
+    driver->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1;
+    driver->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2;
+    driver->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2;
+    driver->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3;
+    driver->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3;
+    driver->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4;
+    driver->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4;
+
+    /* compute random seed from some memory addresses */
+    seed = (FT_UInt32)( (FT_Offset)(char*)&seed          ^
+                        (FT_Offset)(char*)&module        ^
+                        (FT_Offset)(char*)module->memory );
+    seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 );
+
+    driver->random_seed = (FT_Int32)seed;
+    if ( driver->random_seed < 0 )
+      driver->random_seed = -driver->random_seed;
+    else if ( driver->random_seed == 0 )
+      driver->random_seed = 123456789;
 
     return FT_Err_Ok;
   }
index 8bcf886..0221f01 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID objects manager (specification).                                 */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 007609b..b1c7f3c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID-keyed Type1 parser (body).                                       */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 20bebb9..61602f7 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID-keyed Type1 parser (specification).                              */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index bb611a9..d9faf35 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID driver interface (body).                                         */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -20,6 +20,7 @@
 #include "cidriver.h"
 #include "cidgload.h"
 #include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_POSTSCRIPT_PROPS_H
 
 #include "ciderrs.h"
 
 #include FT_SERVICE_FONT_FORMAT_H
 #include FT_SERVICE_POSTSCRIPT_INFO_H
 #include FT_SERVICE_CID_H
+#include FT_SERVICE_PROPERTIES_H
+#include FT_DRIVER_H
+
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
 
 
   /*************************************************************************/
 
 
   /*
+   *  PROPERTY SERVICE
+   *
+   */
+
+  FT_DEFINE_SERVICE_PROPERTIESREC(
+    cid_service_properties,
+
+    (FT_Properties_SetFunc)ps_property_set,      /* set_property */
+    (FT_Properties_GetFunc)ps_property_get )     /* get_property */
+
+
+  /*
    *  SERVICE LIST
    *
    */
     { 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 },
+    { FT_SERVICE_ID_PROPERTIES,           &cid_service_properties },
     { NULL, NULL }
   };
 
       FT_MODULE_FONT_DRIVER       |
       FT_MODULE_DRIVER_SCALABLE   |
       FT_MODULE_DRIVER_HAS_HINTER,
-      sizeof ( FT_DriverRec ),
+      sizeof ( PS_DriverRec ),
 
       "t1cid",   /* module name           */
       0x10000L,  /* version 1.0 of driver */
index 76640c5..59d9ded 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level CID driver interface (specification).                     */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 653cc55..b0e2dac 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    CID token definitions (specification only).                          */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index b30b867..9010e33 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index fcddd92..94333bd 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 93e6f81..61770e3 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType OpenType driver component (body only).                      */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index a120128..74f3c51 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/gxvalid Jamfile
 #
-# Copyright 2005-2017 by
+# Copyright 2005-2018 by
 # suzuki toshiya, Masatake YAMATO and Red Hat K.K.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 7201459..af8128e 100644 (file)
@@ -9,7 +9,7 @@ gxvalid: TrueType GX validator
   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
+  otvalid  module,   gxvalid  uses   FreeType  2's  validator  framework
   (ftvalid).
 
   You can link gxvalid with your program; before running your own layout
@@ -287,11 +287,11 @@ gxvalid: TrueType GX validator
   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.
+    The GX/AAT  extension can  include 255 different  layout features,
+    but    popular    layout     features    are    predefined    (see
+    https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html).
+    Some fonts include feature numbers which are incompatible with the
+    predefined feature registry.
 
     In our survey, there are 140 fonts including `feat' table.
 
@@ -518,7 +518,7 @@ gxvalid: TrueType GX validator
 
 ------------------------------------------------------------------------
 
-Copyright 2004-2017 by
+Copyright 2004-2018 by
 suzuki toshiya, Masatake YAMATO, Red hat K.K.,
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
index da48514..d0577a2 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType validator for TrueTypeGX/AAT tables (body only).            */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 78116ef..19f0379 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT table validation (specification only).                */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 81dff73..c367d38 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT bsln table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index db0a91e..b966011 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT common tables validation (body).                      */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 10b1c80..8e4ff9c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT common tables validation (specification).             */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 80a2b8a..d115125 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT validation module error codes (specification only).   */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 2e3ec6f..2c805d1 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT feat table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 8c0e847..2d94380 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT feat table validation (specification).                */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 8cc08cd..840c0f3 100644 (file)
@@ -5,7 +5,7 @@
 /*    Generate feature registry data for gxv `feat' validator.             */
 /*    This program is derived from gxfeatreg.c in gxlayout.                */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  Masatake YAMATO and Redhat K.K.                                        */
 /*                                                                         */
 /*  This file may only be used,                                            */
@@ -21,7 +21,7 @@
 /*  gxfeatreg.c                                                            */
 /*                                                                         */
 /*    Database of font features pre-defined by Apple Computer, Inc.        */
-/*    http://developer.apple.com/fonts/Registry/                           */
+/*    https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html */
 /*    (body).                                                              */
 /*                                                                         */
 /*  Copyright 2003 by                                                      */
index c8cfd83..00c4293 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT just table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 9f90373..9c0efd7 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT kern table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 775d522..0f261a9 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT lcar table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 84e9275..1a3c862 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType's TrueTypeGX/AAT validation module implementation (body).   */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index df25e60..745c62e 100644 (file)
@@ -5,7 +5,7 @@
 /*    FreeType's TrueTypeGX/AAT validation module implementation           */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 184a631..b361cb2 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT mort table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index d0543ad..d803064 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT common definition for mort table (specification).     */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index a75fad7..95cf53d 100644 (file)
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT mort table validation                                 */
 /*    body for type0 (Indic Script Rearrangement) subtable.                */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 361ef22..a7683a1 100644 (file)
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT mort table validation                                 */
 /*    body for type1 (Contextual Substitution) subtable.                   */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index c17e51e..c23c277 100644 (file)
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT mort table validation                                 */
 /*    body for type2 (Ligature Substitution) subtable.                     */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 041bab3..9d21a5f 100644 (file)
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT mort table validation                                 */
 /*    body for type4 (Non-Contextual Glyph Substitution) subtable.         */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 4751ece..42cb428 100644 (file)
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT mort table validation                                 */
 /*    body for type5 (Contextual Glyph Insertion) subtable.                */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 2bb4f3b..9fd6e6b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT morx table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 20cec58..6d9925e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT common definition for morx table (specification).     */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index e0a0a92..302261b 100644 (file)
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT morx table validation                                 */
 /*    body for type0 (Indic Script Rearrangement) subtable.                */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 9afebdb..890ca74 100644 (file)
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT morx table validation                                 */
 /*    body for type1 (Contextual Substitution) subtable.                   */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 3a60cf6..3135031 100644 (file)
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT morx table validation                                 */
 /*    body for type2 (Ligature Substitution) subtable.                     */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 2955568..1e2397b 100644 (file)
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT morx table validation                                 */
 /*    body for "morx" type4 (Non-Contextual Glyph Substitution) subtable.  */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 05c1141..db4f929 100644 (file)
@@ -5,7 +5,7 @@
 /*    TrueTypeGX/AAT morx table validation                                 */
 /*    body for type5 (Contextual Glyph Insertion) subtable.                */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 11580d8..e2c167e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT opbd table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 7d398b7..a67b6bd 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT prop table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index dd49825..d501b50 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueTypeGX/AAT trak table validation (body).                         */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  suzuki toshiya, Masatake YAMATO, Red Hat K.K.,                         */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
index 7f87e10..b64879d 100644 (file)
@@ -2,7 +2,7 @@
 # FreeType 2 gxvalid module definition
 #
 
-# Copyright 2004-2017 by
+# Copyright 2004-2018 by
 # suzuki toshiya, Masatake YAMATO, Red Hat K.K.,
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
index 10ec08c..3a17c03 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2004-2017 by
+# Copyright 2004-2018 by
 # suzuki toshiya, Masatake YAMATO, Red Hat K.K.,
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
index 170c13a..a7b4c8c 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/gzip Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index c487786..f8011c2 100644 (file)
@@ -8,7 +8,7 @@
 /*  parse compressed PCF fonts, as found with many X11 server              */
 /*  distributions.                                                         */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index bc7d5fa..1a2e48b 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2002-2017 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 8e61f08..cb83aa4 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/lzw Jamfile
 #
-# Copyright 2004-2017 by
+# Copyright 2004-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 941f6ce..cb46f93 100644 (file)
@@ -8,7 +8,7 @@
 /*  be used to parse compressed PCF fonts, as found with many X11 server   */
 /*  distributions.                                                         */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  Albert Chin-A-Young.                                                   */
 /*                                                                         */
 /*  based on code in `src/gzip/ftgzip.c'                                   */
index 486c546..2b868ba 100644 (file)
@@ -8,7 +8,7 @@
 /*  be used to parse compressed PCF fonts, as found with many X11 server   */
 /*  distributions.                                                         */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner.                                                          */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index a108862..4fd267e 100644 (file)
@@ -8,7 +8,7 @@
 /*  be used to parse compressed PCF fonts, as found with many X11 server   */
 /*  distributions.                                                         */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner.                                                          */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index e7bf68a..18933c4 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2004-2017 by
+# Copyright 2004-2018 by
 # Albert Chin-A-Young.
 #
 # based on `src/lzw/rules.mk'
index a755f2b..21b8e0c 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/otvalid Jamfile
 #
-# Copyright 2004-2017 by
+# Copyright 2004-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 5ee1265..34f3dab 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2004-2017 by
+# Copyright 2004-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 312751a..4423ca1 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType validator for OpenType tables (body only).                  */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index f2969cc..d7801ab 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType table validation (specification only).                      */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 3adad84..a01d45c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType BASE table validation (body).                               */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
     OTV_Validator     otvalid = &otvalidrec;
     FT_Bytes          p       = table;
     FT_UInt           table_size;
+    FT_UShort         version;
 
     OTV_OPTIONAL_TABLE( HorizAxis );
     OTV_OPTIONAL_TABLE( VertAxis  );
 
+    OTV_OPTIONAL_TABLE32( itemVarStore );
+
 
     otvalid->root = ftvalid;
 
     FT_TRACE3(( "validating BASE table\n" ));
     OTV_INIT;
 
-    OTV_LIMIT_CHECK( 6 );
+    OTV_LIMIT_CHECK( 4 );
 
-    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */
+    if ( FT_NEXT_USHORT( p ) != 1 )  /* majorVersion */
       FT_INVALID_FORMAT;
 
-    table_size = 6;
+    version = FT_NEXT_USHORT( p );   /* minorVersion */
+
+    table_size = 8;
+    switch ( version )
+    {
+    case 0:
+      OTV_LIMIT_CHECK( 4 );
+      break;
+
+    case 1:
+      OTV_LIMIT_CHECK( 8 );
+      table_size += 4;
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
 
     OTV_OPTIONAL_OFFSET( HorizAxis );
     OTV_SIZE_CHECK( HorizAxis );
     if ( VertAxis )
       otv_Axis_validate( table + VertAxis, otvalid );
 
+    if ( version > 0 )
+    {
+      OTV_OPTIONAL_OFFSET32( itemVarStore );
+      OTV_SIZE_CHECK32( itemVarStore );
+      if ( itemVarStore )
+        OTV_TRACE(( "  [omitting itemVarStore validation]\n" )); /* XXX */
+    }
+
     FT_TRACE4(( "\n" ));
   }
 
index 3407d2a..0ccfb03 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType common tables validation (body).                            */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 
     OTV_NAME_ENTER( "Device" );
 
-    OTV_LIMIT_CHECK( 8 );
+    OTV_LIMIT_CHECK( 6 );
     StartSize   = FT_NEXT_USHORT( p );
     EndSize     = FT_NEXT_USHORT( p );
     DeltaFormat = FT_NEXT_USHORT( p );
 
-    if ( DeltaFormat < 1 || DeltaFormat > 3 )
-      FT_INVALID_FORMAT;
+    if ( DeltaFormat == 0x8000U )
+    {
+      /* VariationIndex, nothing to do */
+    }
+    else
+    {
+      if ( DeltaFormat < 1 || DeltaFormat > 3 )
+        FT_INVALID_FORMAT;
 
-    if ( EndSize < StartSize )
-      FT_INVALID_DATA;
+      if ( EndSize < StartSize )
+        FT_INVALID_DATA;
 
-    count = EndSize - StartSize + 1;
-    OTV_LIMIT_CHECK( ( 1 << DeltaFormat ) * count / 8 );  /* DeltaValue */
+      count = EndSize - StartSize + 1;
+      OTV_LIMIT_CHECK( ( 1 << DeltaFormat ) * count / 8 );  /* DeltaValue */
+    }
 
     OTV_EXIT;
   }
                        OTV_Validator  otvalid )
   {
     FT_Bytes           p = table;
-    FT_UInt            LookupType, SubTableCount;
+    FT_UInt            LookupType, LookupFlag, SubTableCount;
     OTV_Validate_Func  validate;
 
 
 
     OTV_LIMIT_CHECK( 6 );
     LookupType    = FT_NEXT_USHORT( p );
-    p            += 2;                      /* skip LookupFlag */
+    LookupFlag    = FT_NEXT_USHORT( p );
     SubTableCount = FT_NEXT_USHORT( p );
 
     OTV_TRACE(( " (type %d)\n", LookupType ));
     for ( ; SubTableCount > 0; SubTableCount-- )
       validate( table + FT_NEXT_USHORT( p ), otvalid );
 
+    if ( LookupFlag & 0x10 )
+      OTV_LIMIT_CHECK( 2 );  /* MarkFilteringSet */
+
     OTV_EXIT;
   }
 
index 10a603e..a392784 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType common tables validation (specification).                   */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -67,29 +67,38 @@ FT_BEGIN_HEADER
 
 
 #undef  FT_INVALID_
-#define FT_INVALID_( _error ) \
+#define FT_INVALID_( _error )                                     \
           ft_validator_error( otvalid->root, FT_THROW( _error ) )
 
 #define OTV_OPTIONAL_TABLE( _table )  FT_UShort  _table;      \
                                       FT_Bytes   _table ## _p
 
+#define OTV_OPTIONAL_TABLE32( _table )  FT_ULong  _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                             \
+#define OTV_OPTIONAL_OFFSET32( _offset )        \
+          FT_BEGIN_STMNT                        \
+            _offset ## _p = p;                  \
+            _offset       = FT_NEXT_ULONG( p ); \
+          FT_END_STMNT
+
+#define OTV_LIMIT_CHECK( _count )                      \
+          FT_BEGIN_STMNT                               \
             if ( p + (_count) > otvalid->root->limit ) \
-              FT_INVALID_TOO_SHORT;                  \
+              FT_INVALID_TOO_SHORT;                    \
           FT_END_STMNT
 
 #define OTV_SIZE_CHECK( _size )                                     \
           FT_BEGIN_STMNT                                            \
             if ( _size > 0 && _size < table_size )                  \
             {                                                       \
-              if ( otvalid->root->level == FT_VALIDATE_PARANOID )     \
+              if ( otvalid->root->level == FT_VALIDATE_PARANOID )   \
                 FT_INVALID_OFFSET;                                  \
               else                                                  \
               {                                                     \
@@ -102,12 +111,33 @@ FT_BEGIN_HEADER
                             " set to zero.\n"                       \
                             "\n", #_size ));                        \
                                                                     \
-                /* always assume 16bit entities */                  \
                 _size = pp[0] = pp[1] = 0;                          \
               }                                                     \
             }                                                       \
           FT_END_STMNT
 
+#define OTV_SIZE_CHECK32( _size )                                   \
+          FT_BEGIN_STMNT                                            \
+            if ( _size > 0 && _size < table_size )                  \
+            {                                                       \
+              if ( otvalid->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 ));                        \
+                                                                    \
+                _size = pp[0] = pp[1] = pp[2] = pp[3] = 0;          \
+              }                                                     \
+            }                                                       \
+          FT_END_STMNT
+
 
 #define  OTV_NAME_(x)  #x
 #define  OTV_NAME(x)   OTV_NAME_(x)
@@ -146,11 +176,11 @@ FT_BEGIN_HEADER
 
 #define OTV_INIT  otvalid->debug_indent = 0
 
-#define OTV_ENTER                                                              \
-          FT_BEGIN_STMNT                                                       \
-            otvalid->debug_indent += 2;                                        \
-            FT_TRACE4(( "%*.s", otvalid->debug_indent, 0 ));                   \
-            FT_TRACE4(( "%s table\n",                                          \
+#define OTV_ENTER                                                                \
+          FT_BEGIN_STMNT                                                         \
+            otvalid->debug_indent += 2;                                          \
+            FT_TRACE4(( "%*.s", otvalid->debug_indent, 0 ));                     \
+            FT_TRACE4(( "%s table\n",                                            \
                         otvalid->debug_function_name[otvalid->nesting_level] )); \
           FT_END_STMNT
 
index 6999039..2fcf42e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType validation module error codes (specification only).         */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 27b9a69..08f3171 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType GDEF table validation (body).                               */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -68,7 +68,7 @@
     OTV_LIMIT_CHECK( GlyphCount * 2 );
 
     otvalid->nesting_level++;
-    func          = otvalid->func[otvalid->nesting_level];
+    func            = otvalid->func[otvalid->nesting_level];
     otvalid->extra1 = 0;
 
     for ( ; GlyphCount > 0; GlyphCount-- )
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
+  /*****                       MARK GLYPH SETS                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  static void
+  otv_MarkGlyphSets_validate( FT_Bytes       table,
+                              OTV_Validator  otvalid )
+  {
+    FT_Bytes  p = table;
+    FT_UInt   MarkGlyphSetCount;
+
+
+    OTV_NAME_ENTER( "MarkGlyphSets" );
+
+    p += 2;     /* skip Format */
+
+    OTV_LIMIT_CHECK( 2 );
+    MarkGlyphSetCount = FT_NEXT_USHORT( p );
+
+    OTV_TRACE(( " (MarkGlyphSetCount = %d)\n", MarkGlyphSetCount ));
+
+    OTV_LIMIT_CHECK( MarkGlyphSetCount * 4 );      /* CoverageOffsets */
+
+    for ( ; MarkGlyphSetCount > 0; MarkGlyphSetCount-- )
+      otv_Coverage_validate( table + FT_NEXT_ULONG( p ), otvalid, -1 );
+
+    OTV_EXIT;
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
   /*****                         GDEF TABLE                            *****/
   /*****                                                               *****/
   /*************************************************************************/
   {
     OTV_ValidatorRec  otvalidrec;
     OTV_Validator     otvalid = &otvalidrec;
-    FT_Bytes          p     = table;
+    FT_Bytes          p       = table;
     FT_UInt           table_size;
-    FT_Bool           need_MarkAttachClassDef;
+    FT_UShort         version;
+    FT_Bool           need_MarkAttachClassDef = 1;
 
     OTV_OPTIONAL_TABLE( GlyphClassDef );
     OTV_OPTIONAL_TABLE( AttachListOffset );
     OTV_OPTIONAL_TABLE( LigCaretListOffset );
     OTV_OPTIONAL_TABLE( MarkAttachClassDef );
+    OTV_OPTIONAL_TABLE( MarkGlyphSetsDef );
+
+    OTV_OPTIONAL_TABLE32( itemVarStore );
 
 
     otvalid->root = ftvalid;
     FT_TRACE3(( "validating GDEF table\n" ));
     OTV_INIT;
 
-    OTV_LIMIT_CHECK( 12 );
+    OTV_LIMIT_CHECK( 4 );
 
-    if ( FT_NEXT_ULONG( p ) != 0x10000UL )          /* Version */
+    if ( FT_NEXT_USHORT( p ) != 1 )  /* majorVersion */
       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.                         */
+    version = FT_NEXT_USHORT( p );   /* minorVersion */
 
-    need_MarkAttachClassDef = FT_BOOL(
-      otv_GSUBGPOS_have_MarkAttachmentType_flag( gsub ) ||
-      otv_GSUBGPOS_have_MarkAttachmentType_flag( gpos ) );
+    table_size = 10;
+    switch ( version )
+    {
+    case 0:
+      /* 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 )
+      {
+        OTV_LIMIT_CHECK( 8 );
+        table_size += 2;
+      }
+      else
+        OTV_LIMIT_CHECK( 6 );  /* OpenType < 1.2 */
 
-    if ( need_MarkAttachClassDef )
-      table_size = 12;              /* OpenType >= 1.2 */
-    else
-      table_size = 10;              /* OpenType < 1.2  */
+      break;
+
+    case 2:
+      OTV_LIMIT_CHECK( 10 );
+      table_size += 4;
+      break;
+
+    case 3:
+      OTV_LIMIT_CHECK( 14 );
+      table_size += 8;
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
 
     otvalid->glyph_count = glyph_count;
 
         otv_ClassDef_validate( table + MarkAttachClassDef, otvalid );
     }
 
+    if ( version > 0 )
+    {
+      OTV_OPTIONAL_OFFSET( MarkGlyphSetsDef );
+      OTV_SIZE_CHECK( MarkGlyphSetsDef );
+      if ( MarkGlyphSetsDef )
+        otv_MarkGlyphSets_validate( table + MarkGlyphSetsDef, otvalid );
+    }
+
+    if ( version > 2 )
+    {
+      OTV_OPTIONAL_OFFSET32( itemVarStore );
+      OTV_SIZE_CHECK32( itemVarStore );
+      if ( itemVarStore )
+        OTV_TRACE(( "  [omitting itemVarStore validation]\n" )); /* XXX */
+    }
+
     FT_TRACE4(( "\n" ));
   }
 
index 0fbcc20..696b35c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType GPOS table validation (body).                               */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
     otv_MarkArray_validate( table + Array1, otvalid );
 
     otvalid->nesting_level++;
-    func          = otvalid->func[otvalid->nesting_level];
+    func            = otvalid->func[otvalid->nesting_level];
     otvalid->extra1 = ClassCount;
 
     func( table + Array2, otvalid );
         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 - otvalid->extra3;
 
         OTV_SIZE_CHECK( device );
 
     case 3:
       {
-        FT_UInt   table_size;
+        FT_UInt  table_size;
 
         OTV_OPTIONAL_TABLE( XDeviceTable );
         OTV_OPTIONAL_TABLE( YDeviceTable );
   /*************************************************************************/
   /*************************************************************************/
 
+  /* sets otvalid->extra3 (pointer to base table) */
+
   static void
   otv_PairSet_validate( FT_Bytes       table,
                         FT_UInt        format1,
 
     OTV_NAME_ENTER( "PairSet" );
 
+    otvalid->extra3 = table;
+
     OTV_LIMIT_CHECK( 2 );
     PairValueCount = FT_NEXT_USHORT( p );
 
 
     OTV_TRACE(( " (format %d)\n", PosFormat ));
 
-    otvalid->extra3 = table;
-
     switch ( PosFormat )
     {
     case 1:     /* PairPosFormat1 */
         otv_ClassDef_validate( table + ClassDef2, otvalid );
 
         OTV_LIMIT_CHECK( ClassCount1 * ClassCount2 *
-                     ( len_value1 + len_value2 ) );
+                         ( len_value1 + len_value2 ) );
+
+        otvalid->extra3 = table;
 
         /* Class1Record */
         for ( ; ClassCount1 > 0; ClassCount1-- )
   {
     OTV_ValidatorRec  validrec;
     OTV_Validator     otvalid = &validrec;
-    FT_Bytes          p     = table;
+    FT_Bytes          p       = table;
+    FT_UInt           table_size;
+    FT_UShort         version;
     FT_UInt           ScriptList, FeatureList, LookupList;
 
+    OTV_OPTIONAL_TABLE32( featureVariations );
+
 
     otvalid->root = ftvalid;
 
     FT_TRACE3(( "validating GPOS table\n" ));
     OTV_INIT;
 
-    OTV_LIMIT_CHECK( 10 );
+    OTV_LIMIT_CHECK( 4 );
 
-    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */
+    if ( FT_NEXT_USHORT( p ) != 1 )  /* majorVersion */
       FT_INVALID_FORMAT;
 
+    version = FT_NEXT_USHORT( p );   /* minorVersion */
+
+    table_size = 10;
+    switch ( version )
+    {
+    case 0:
+      OTV_LIMIT_CHECK( 6 );
+      break;
+
+    case 1:
+      OTV_LIMIT_CHECK( 10 );
+      table_size += 4;
+      break;
+
+    default:
+      FT_INVALID_FORMAT;
+    }
+
     ScriptList  = FT_NEXT_USHORT( p );
     FeatureList = FT_NEXT_USHORT( p );
     LookupList  = FT_NEXT_USHORT( p );
     otv_ScriptList_validate( table + ScriptList, table + FeatureList,
                              otvalid );
 
+    if ( version > 0 )
+    {
+      OTV_OPTIONAL_OFFSET32( featureVariations );
+      OTV_SIZE_CHECK32( featureVariations );
+      if ( featureVariations )
+        OTV_TRACE(( "  [omitting featureVariations validation]\n" )); /* XXX */
+    }
+
     FT_TRACE4(( "\n" ));
   }
 
index 99b0ad3..95f9ac3 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType GPOS table validator (specification).                       */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index f9bd8dc..d35ea67 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType GSUB table validation (body).                               */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
     OTV_ValidatorRec  otvalidrec;
     OTV_Validator     otvalid = &otvalidrec;
     FT_Bytes          p       = table;
+    FT_UInt           table_size;
+    FT_UShort         version;
     FT_UInt           ScriptList, FeatureList, LookupList;
 
+    OTV_OPTIONAL_TABLE32( featureVariations );
+
 
     otvalid->root = ftvalid;
 
     FT_TRACE3(( "validating GSUB table\n" ));
     OTV_INIT;
 
-    OTV_LIMIT_CHECK( 10 );
+    OTV_LIMIT_CHECK( 4 );
+
+    if ( FT_NEXT_USHORT( p ) != 1 )  /* majorVersion */
+      FT_INVALID_FORMAT;
+
+    version = FT_NEXT_USHORT( p );   /* minorVersion */
+
+    table_size = 10;
+    switch ( version )
+    {
+    case 0:
+      OTV_LIMIT_CHECK( 6 );
+      break;
+
+    case 1:
+      OTV_LIMIT_CHECK( 10 );
+      table_size += 4;
+      break;
 
-    if ( FT_NEXT_ULONG( p ) != 0x10000UL )      /* Version */
+    default:
       FT_INVALID_FORMAT;
+    }
 
     ScriptList  = FT_NEXT_USHORT( p );
     FeatureList = FT_NEXT_USHORT( p );
     otv_ScriptList_validate( table + ScriptList, table + FeatureList,
                              otvalid );
 
+    if ( version > 0 )
+    {
+      OTV_OPTIONAL_OFFSET32( featureVariations );
+      OTV_SIZE_CHECK32( featureVariations );
+      if ( featureVariations )
+        OTV_TRACE(( "  [omitting featureVariations validation]\n" )); /* XXX */
+    }
+
     FT_TRACE4(( "\n" ));
   }
 
index 57a38f9..94d4af9 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType JSTF table validation (body).                               */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index a14d369..b9800f6 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    OpenType MATH table validation (body).                               */
 /*                                                                         */
-/*  Copyright 2007-2017 by                                                 */
+/*  Copyright 2007-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  Written by George Williams.                                            */
index 35ffc43..89ee449 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType's OpenType validation module implementation (body).         */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 30d401d..6917bcc 100644 (file)
@@ -5,7 +5,7 @@
 /*    FreeType's OpenType validation module implementation                 */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 10329a9..d4fc723 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2004-2017 by
+# Copyright 2004-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 794f27d..7b92b12 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/pcf Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 10eff15..09ea970 100644 (file)
@@ -41,8 +41,8 @@ value given as argument into the corresponding glyph number.
 Known problems
 **************
 
-- dealing explicitly with encodings breaks the uniformity of freetype2
-  api.
+- dealing explicitly with encodings breaks the uniformity of FreeType 2
+  API.
 
 - except for encodings properties, client applications have no
   visibility of the PCF_Face object.  This means that applications
index 9f4d36d..0119d94 100644 (file)
@@ -50,7 +50,7 @@ THE SOFTWARE.
 #include FT_SERVICE_BDF_H
 #include FT_SERVICE_FONT_FORMAT_H
 #include FT_SERVICE_PROPERTIES_H
-#include FT_PCF_DRIVER_H
+#include FT_DRIVER_H
 
 
   /*************************************************************************/
@@ -387,7 +387,11 @@ THE SOFTWARE.
           if ( !ft_strcmp( s, "10646" )                      ||
                ( !ft_strcmp( s, "8859" ) &&
                  !ft_strcmp( face->charset_encoding, "1" ) ) )
-          unicode_charmap = 1;
+            unicode_charmap = 1;
+          /* another name for ASCII */
+          else if ( !ft_strcmp( s, "646.1991" )                 &&
+                    !ft_strcmp( face->charset_encoding, "IRV" ) )
+            unicode_charmap = 1;
         }
       }
 
@@ -409,12 +413,6 @@ THE SOFTWARE.
         }
 
         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
       }
     }
 
index 3eacf2b..537da0d 100644 (file)
@@ -840,7 +840,7 @@ THE SOFTWARE.
     FT_TRACE4(( "pcf_get_bitmaps:\n"
                 "  format: 0x%lX\n"
                 "          (%s, %s,\n"
-                "           padding=%d bits, scanning=%d bits)\n",
+                "           padding=%d bit%s, scanning=%d bit%s)\n",
                 format,
                 PCF_BYTE_ORDER( format ) == MSBFirst
                   ? "most significant byte first"
@@ -849,7 +849,9 @@ THE SOFTWARE.
                   ? "most significant bit first"
                   : "least significant bit first",
                 8 << PCF_GLYPH_PAD_INDEX( format ),
-                8 << PCF_SCAN_UNIT_INDEX( format ) ));
+                ( 8 << PCF_GLYPH_PAD_INDEX( format ) ) == 1 ? "" : "s",
+                8 << PCF_SCAN_UNIT_INDEX( format ),
+                ( 8 << PCF_SCAN_UNIT_INDEX( format ) ) == 1 ? "" : "s" ));
 
     if ( !PCF_FORMAT_MATCH( format, PCF_DEFAULT_FORMAT ) )
       return FT_THROW( Invalid_File_Format );
@@ -1162,6 +1164,20 @@ THE SOFTWARE.
                 accel->fontDescent,
                 accel->maxOverlap ));
 
+    /* sanity checks */
+    if ( FT_ABS( accel->fontAscent ) > 0x7FFF )
+    {
+      accel->fontAscent = accel->fontAscent < 0 ? -0x7FFF : 0x7FFF;
+      FT_TRACE0(( "pfc_get_accel: clamping font ascent to value %d\n",
+                  accel->fontAscent ));
+    }
+    if ( FT_ABS( accel->fontDescent ) > 0x7FFF )
+    {
+      accel->fontDescent = accel->fontDescent < 0 ? -0x7FFF : 0x7FFF;
+      FT_TRACE0(( "pfc_get_accel: clamping font descent to value %d\n",
+                  accel->fontDescent ));
+    }
+
     FT_TRACE5(( "  minbounds:" ));
     error = pcf_get_metric( stream,
                             format & ( ~PCF_FORMAT_MASK ),
@@ -1496,8 +1512,16 @@ THE SOFTWARE.
         if ( face->accel.fontAscent + face->accel.fontDescent < 0 )
           FT_TRACE0(( "pcf_load_font: negative height\n" ));
 #endif
-        bsize->height = FT_ABS( (FT_Short)( face->accel.fontAscent +
-                                            face->accel.fontDescent ) );
+        if ( FT_ABS( face->accel.fontAscent +
+                     face->accel.fontDescent ) > 0x7FFF )
+        {
+          bsize->height = 0x7FFF;
+          FT_TRACE0(( "pcf_load_font: clamping height to value %d\n",
+                      bsize->height ));
+        }
+        else
+          bsize->height = FT_ABS( (FT_Short)( face->accel.fontAscent +
+                                              face->accel.fontDescent ) );
 
         prop = pcf_find_property( face, "AVERAGE_WIDTH" );
         if ( prop )
@@ -1506,10 +1530,20 @@ THE SOFTWARE.
           if ( prop->value.l < 0 )
             FT_TRACE0(( "pcf_load_font: negative average width\n" ));
 #endif
-          bsize->width = FT_ABS( (FT_Short)( ( prop->value.l ) + 5 ) / 10 );
+          if ( ( FT_ABS( prop->value.l ) > 0x7FFFL * 10 - 5 ) )
+          {
+            bsize->width = 0x7FFF;
+            FT_TRACE0(( "pcf_load_font: clamping average width to value %d\n",
+                        bsize->width ));
+          }
+          else
+            bsize->width = FT_ABS( (FT_Short)( ( prop->value.l + 5 ) / 10 ) );
         }
         else
+        {
+          /* this is a heuristical value */
           bsize->width = (FT_Short)FT_MulDiv( bsize->height, 2, 3 );
+        }
 
         prop = pcf_find_property( face, "POINT_SIZE" );
         if ( prop )
@@ -1519,9 +1553,16 @@ THE SOFTWARE.
             FT_TRACE0(( "pcf_load_font: negative point size\n" ));
 #endif
           /* convert from 722.7 decipoints to 72 points per inch */
-          bsize->size = FT_MulDiv( FT_ABS( prop->value.l ),
-                                   64 * 7200,
-                                   72270L );
+          if ( FT_ABS( prop->value.l ) > 0x504C2L ) /* 0x7FFF * 72270/7200 */
+          {
+            bsize->size = 0x7FFF;
+            FT_TRACE0(( "pcf_load_font: clamping point size to value %d\n",
+                        bsize->size ));
+          }
+          else
+            bsize->size = FT_MulDiv( FT_ABS( prop->value.l ),
+                                     64 * 7200,
+                                     72270L );
         }
 
         prop = pcf_find_property( face, "PIXEL_SIZE" );
@@ -1531,7 +1572,14 @@ THE SOFTWARE.
           if ( prop->value.l < 0 )
             FT_TRACE0(( "pcf_load_font: negative pixel size\n" ));
 #endif
-          bsize->y_ppem = FT_ABS( (FT_Short)prop->value.l ) << 6;
+          if ( FT_ABS( prop->value.l ) > 0x7FFF )
+          {
+            bsize->y_ppem = 0x7FFF << 6;
+            FT_TRACE0(( "pcf_load_font: clamping pixel size to value %d\n",
+                        bsize->y_ppem ));
+          }
+          else
+            bsize->y_ppem = FT_ABS( (FT_Short)prop->value.l ) << 6;
         }
 
         prop = pcf_find_property( face, "RESOLUTION_X" );
@@ -1541,7 +1589,14 @@ THE SOFTWARE.
           if ( prop->value.l < 0 )
             FT_TRACE0(( "pcf_load_font: negative X resolution\n" ));
 #endif
-          resolution_x = FT_ABS( (FT_Short)prop->value.l );
+          if ( FT_ABS( prop->value.l ) > 0x7FFF )
+          {
+            resolution_x = 0x7FFF;
+            FT_TRACE0(( "pcf_load_font: clamping X resolution to value %d\n",
+                        resolution_x ));
+          }
+          else
+            resolution_x = FT_ABS( (FT_Short)prop->value.l );
         }
 
         prop = pcf_find_property( face, "RESOLUTION_Y" );
@@ -1551,7 +1606,14 @@ THE SOFTWARE.
           if ( prop->value.l < 0 )
             FT_TRACE0(( "pcf_load_font: negative Y resolution\n" ));
 #endif
-          resolution_y = FT_ABS( (FT_Short)prop->value.l );
+          if ( FT_ABS( prop->value.l ) > 0x7FFF )
+          {
+            resolution_y = 0x7FFF;
+            FT_TRACE0(( "pcf_load_font: clamping Y resolution to value %d\n",
+                        resolution_y ));
+          }
+          else
+            resolution_y = FT_ABS( (FT_Short)prop->value.l );
         }
 
         if ( bsize->y_ppem == 0 )
index 1783171..cb55a7e 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/pfr Jamfile
 #
-# Copyright 2002-2017 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 7b84da9..27fec8e 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2002-2017 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 4f31f5d..1760882 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR driver component.                                       */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 1d6b15b..6064378 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR cmap handling (body).                                   */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 957bf65..c70a0c8 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR cmap handling (specification).                          */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 195cdb7..6c7e501 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR driver interface (body).                                */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index b81d560..cab8527 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level Type PFR driver interface (specification).                */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index ef044e3..7027c81 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PFR error codes (specification only).                                */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 93f5fc7..b799019 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR glyph loader (body).                                    */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 
       count = glyph->num_subs - old_count;
 
-      FT_TRACE4(( "compound glyph with %d elements (offset %lu):\n",
-                  count, offset ));
+      FT_TRACE4(( "compound glyph with %d element%s (offset %lu):\n",
+                  count,
+                  count == 1 ? "" : "s",
+                  offset ));
 
       /* now, load each individual glyph */
       for ( n = 0; n < count; n++ )
         /* proceed to next sub-glyph */
       }
 
-      FT_TRACE4(( "end compound glyph with %d elements\n", count ));
+      FT_TRACE4(( "end compound glyph with %d element%s\n",
+                  count,
+                  count == 1 ? "" : "s" ));
     }
     else
     {
index 6612323..01f48d7 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR glyph loader (specification).                           */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 4f84165..2776da4 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR loader (body).                                          */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index f9475ae..36e809a 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR loader (specification).                                 */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 4b1703f..737b97b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR object methods (body).                                  */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
         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 have loaded any kerning pairs */
index d6ad656..59c709f 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR object methods (specification).                         */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 54e7d0e..ba909dd 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR bitmap loader (body).                                   */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index fc270f5..07b27bc 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR bitmap loader (specification).                          */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index c3d542c..058d6aa 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PFR data structures (specification only).                   */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 9940f62..3acb795 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2002-2017 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 798b73d..a231d59 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/psaux Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -22,6 +22,16 @@ SubDir  FT2_TOP $(FT2_SRC_DIR) psaux ;
                psobjs
                t1cmap
                t1decode
+               cffdecode
+               psarrst
+               psblues
+               pserror
+               psfont
+               psft
+               pshints
+               psintrp
+               psread
+               psstack
                ;
   }
   else
index ff2cc8c..0c33d59 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    AFM parser (body).                                                   */
 /*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index cd2beb7..86f852a 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    AFM parser (specification).                                          */
 /*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
diff --git a/src/psaux/cffdecode.c b/src/psaux/cffdecode.c
new file mode 100644 (file)
index 0000000..80d622c
--- /dev/null
@@ -0,0 +1,2370 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffdecode.c                                                            */
+/*                                                                         */
+/*    PostScript CFF (Type 2) decoding routines (body).                    */
+/*                                                                         */
+/*  Copyright 2017-2018 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.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_SERVICE_H
+#include FT_SERVICE_CFF_TABLE_LOAD_H
+
+#include "cffdecode.h"
+#include "psobjs.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_cffdecode
+
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+
+  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 */
+  };
+
+
+  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 FT_THROW( 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 FT_THROW( 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 = decoder->get_glyph_callback( face, (FT_UInt)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, 0 );
+      decoder->seac = FALSE;
+
+      decoder->free_glyph_callback( 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 = decoder->get_glyph_callback( face, (FT_UInt)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, 0 );
+      decoder->seac = FALSE;
+
+      decoder->free_glyph_callback( 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;
+  }
+
+#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /**********                                                      *********/
+  /**********                                                      *********/
+  /**********             GENERIC CHARSTRING PARSING               *********/
+  /**********                                                      *********/
+  /**********                                                      *********/
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <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;
+  }
+
+
+  FT_LOCAL_DEF( FT_Int )
+  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,
+                                   FT_Int    charcode )
+  {
+    FT_UInt    n;
+    FT_UShort  glyph_sid;
+
+    FT_Service_CFFLoad  cffload;
+
+
+    /* 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;
+
+#if 0
+    /* retrieve cffload from list of current modules */
+    FT_Service_CFFLoad  cffload;
+
+
+    FT_FACE_FIND_GLOBAL_SERVICE( face, cffload, CFF_LOAD );
+    if ( !cffload )
+    {
+      FT_ERROR(( "cff_lookup_glyph_by_stdcharcode:"
+                 " the `cffload' module is not available\n" ));
+      return FT_THROW( Unimplemented_Feature );
+    }
+#endif
+
+    cffload = (FT_Service_CFFLoad)cff->cffload;
+
+    /* Get code to SID mapping from `cff_standard_encoding'. */
+    glyph_sid = cffload->get_standard_encoding( (FT_UInt)charcode );
+
+    for ( n = 0; n < cff->num_glyphs; n++ )
+    {
+      if ( cff->charset.sids[n] == glyph_sid )
+        return (FT_Int)n;
+    }
+
+    return -1;
+  }
+
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <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.   */
+  /*                                                                       */
+  /*    in_dict         :: Set to 1 if function is called from top or      */
+  /*                       private DICT (needed for Multiple Master CFFs). */
+  /*                                                                       */
+  /* <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_Bool       in_dict )
+  {
+    FT_Error           error;
+    CFF_Decoder_Zone*  zone;
+    FT_Byte*           ip;
+    FT_Byte*           limit;
+    CFF_Builder*       builder = &decoder->builder;
+    FT_Pos             x, y;
+    FT_Fixed*          stack;
+    FT_Int             charstring_type =
+                         decoder->cff->top_font.font_dict.charstring_type;
+    FT_UShort          num_designs =
+                         decoder->cff->top_font.font_dict.num_designs;
+    FT_UShort          num_axes =
+                         decoder->cff->top_font.font_dict.num_axes;
+
+    T2_Hints_Funcs  hinter;
+
+
+    /* set default width */
+    decoder->num_hints  = 0;
+    decoder->read_width = 1;
+
+    /* 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 = FT_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 we use shifts, all computations are done with unsigned */
+        /* values; the conversion to a signed value is the last step */
+        if ( v == 28 )
+        {
+          if ( ip + 1 >= limit )
+            goto Syntax_Error;
+          val = (FT_Short)( ( (FT_UShort)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)( ( (FT_UInt32)ip[0] << 24 ) |
+                            ( (FT_UInt32)ip[1] << 16 ) |
+                            ( (FT_UInt32)ip[2] <<  8 ) |
+                              (FT_UInt32)ip[3]         );
+          ip += 4;
+          if ( charstring_type == 2 )
+            shift = 0;
+        }
+        if ( decoder->top - stack >= CFF_MAX_OPERANDS )
+          goto Stack_Overflow;
+
+        val             = (FT_Int32)( (FT_UInt32)val << shift );
+        *decoder->top++ = val;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+        if ( !( val & 0xFFFFL ) )
+          FT_TRACE4(( " %hd", (FT_Short)( (FT_UInt32)val >> 16 ) ));
+        else
+          FT_TRACE4(( " %.5f", 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;
+
+        /* in Multiple Master CFFs, T2 charstrings can appear in */
+        /* dictionaries, but some operators are prohibited       */
+        if ( in_dict )
+        {
+          switch ( op )
+          {
+          case cff_op_hstem:
+          case cff_op_vstem:
+          case cff_op_vmoveto:
+          case cff_op_rlineto:
+          case cff_op_hlineto:
+          case cff_op_vlineto:
+          case cff_op_rrcurveto:
+          case cff_op_hstemhm:
+          case cff_op_hintmask:
+          case cff_op_cntrmask:
+          case cff_op_rmoveto:
+          case cff_op_hmoveto:
+          case cff_op_vstemhm:
+          case cff_op_rcurveline:
+          case cff_op_rlinecurve:
+          case cff_op_vvcurveto:
+          case cff_op_hhcurveto:
+          case cff_op_vhcurveto:
+          case cff_op_hvcurveto:
+          case cff_op_hflex:
+          case cff_op_flex:
+          case cff_op_hflex1:
+          case cff_op_flex1:
+          case cff_op_callsubr:
+          case cff_op_callgsubr:
+            goto MM_Error;
+
+          default:
+            break;
+          }
+        }
+
+        /* 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 = in_dict
+                               ? 0
+                               : ( ( 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,
+                                (FT_UInt)builder->current->n_points,
+                                (FT_UInt)decoder->num_hints,
+                                ip );
+            else
+              hinter->counter( hinter->hints,
+                               (FT_UInt)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    = ADD_LONG( x, args[-2] );
+          y    = ADD_LONG( y, args[-1] );
+          args = stack;
+          break;
+
+        case cff_op_vmoveto:
+          FT_TRACE4(( " vmoveto\n" ));
+
+          cff_builder_close_contour( builder );
+          builder->path_begun = 0;
+          y    = ADD_LONG( y, args[-1] );
+          args = stack;
+          break;
+
+        case cff_op_hmoveto:
+          FT_TRACE4(( " hmoveto\n" ));
+
+          cff_builder_close_contour( builder );
+          builder->path_begun = 0;
+          x    = ADD_LONG( x, args[-1] );
+          args = stack;
+          break;
+
+        case cff_op_rlineto:
+          FT_TRACE4(( " rlineto\n" ));
+
+          if ( cff_builder_start_point( builder, x, y )  ||
+               cff_check_points( builder, num_args / 2 ) )
+            goto Fail;
+
+          if ( num_args < 2 )
+            goto Stack_Underflow;
+
+          args -= num_args & ~1;
+          while ( args < decoder->top )
+          {
+            x = ADD_LONG( x, args[0] );
+            y = ADD_LONG( 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 ) ||
+                 cff_check_points( builder, num_args )    )
+              goto Fail;
+
+            args = stack;
+            while ( args < decoder->top )
+            {
+              if ( phase )
+                x = ADD_LONG( x, args[0] );
+              else
+                y = ADD_LONG( 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 ) ||
+                 cff_check_points( builder, nargs / 2 )   )
+              goto Fail;
+
+            args -= nargs;
+            while ( args < decoder->top )
+            {
+              x = ADD_LONG( x, args[0] );
+              y = ADD_LONG( y, args[1] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              x = ADD_LONG( x, args[2] );
+              y = ADD_LONG( y, args[3] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              x = ADD_LONG( x, args[4] );
+              y = ADD_LONG( 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 = ADD_LONG( x, args[0] );
+              args++;
+              nargs--;
+            }
+
+            if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )
+              goto Fail;
+
+            while ( args < decoder->top )
+            {
+              y = ADD_LONG( y, args[0] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              x = ADD_LONG( x, args[1] );
+              y = ADD_LONG( y, args[2] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              y = ADD_LONG( 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 = ADD_LONG( y, args[0] );
+              args++;
+              nargs--;
+            }
+
+            if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) )
+              goto Fail;
+
+            while ( args < decoder->top )
+            {
+              x = ADD_LONG( x, args[0] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              x = ADD_LONG( x, args[1] );
+              y = ADD_LONG( y, args[2] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              x = ADD_LONG( 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 ( cff_check_points( builder, ( nargs / 4 ) * 3 ) )
+              goto Stack_Underflow;
+
+            phase = ( op == cff_op_hvcurveto );
+
+            while ( nargs >= 4 )
+            {
+              nargs -= 4;
+              if ( phase )
+              {
+                x = ADD_LONG( x, args[0] );
+                cff_builder_add_point( builder, x, y, 0 );
+
+                x = ADD_LONG( x, args[1] );
+                y = ADD_LONG( y, args[2] );
+                cff_builder_add_point( builder, x, y, 0 );
+
+                y = ADD_LONG( y, args[3] );
+                if ( nargs == 1 )
+                  x = ADD_LONG( x, args[4] );
+                cff_builder_add_point( builder, x, y, 1 );
+              }
+              else
+              {
+                y = ADD_LONG( y, args[0] );
+                cff_builder_add_point( builder, x, y, 0 );
+
+                x = ADD_LONG( x, args[1] );
+                y = ADD_LONG( y, args[2] );
+                cff_builder_add_point( builder, x, y, 0 );
+
+                x = ADD_LONG( x, args[3] );
+                if ( nargs == 1 )
+                  y = ADD_LONG( 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 )   ||
+                 cff_check_points( builder, num_lines + 3 ) )
+              goto Fail;
+
+            args -= nargs;
+
+            /* first, add the line segments */
+            while ( num_lines > 0 )
+            {
+              x = ADD_LONG( x, args[0] );
+              y = ADD_LONG( y, args[1] );
+              cff_builder_add_point( builder, x, y, 1 );
+
+              args += 2;
+              num_lines--;
+            }
+
+            /* then the curve */
+            x = ADD_LONG( x, args[0] );
+            y = ADD_LONG( y, args[1] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            x = ADD_LONG( x, args[2] );
+            y = ADD_LONG( y, args[3] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            x = ADD_LONG( x, args[4] );
+            y = ADD_LONG( 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 )        ||
+                 cff_check_points( builder, num_curves * 3 + 2 ) )
+              goto Fail;
+
+            args -= nargs;
+
+            /* first, add the curves */
+            while ( num_curves > 0 )
+            {
+              x = ADD_LONG( x, args[0] );
+              y = ADD_LONG( y, args[1] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              x = ADD_LONG( x, args[2] );
+              y = ADD_LONG( y, args[3] );
+              cff_builder_add_point( builder, x, y, 0 );
+
+              x = ADD_LONG( x, args[4] );
+              y = ADD_LONG( y, args[5] );
+              cff_builder_add_point( builder, x, y, 1 );
+
+              args += 6;
+              num_curves--;
+            }
+
+            /* then the final line */
+            x = ADD_LONG( x, args[0] );
+            y = ADD_LONG( 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 ) ||
+                 cff_check_points( builder, 6 )           )
+              goto Fail;
+
+            /* record the starting point's y position for later use */
+            start_y = y;
+
+            /* first control point */
+            x = ADD_LONG( x, args[0] );
+            y = ADD_LONG( y, args[1] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* second control point */
+            x = ADD_LONG( x, args[2] );
+            y = ADD_LONG( 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 = ADD_LONG( 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 = ADD_LONG( x, args[5] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* fourth control point */
+            x = ADD_LONG( x, args[6] );
+            y = ADD_LONG( y, args[7] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* ending point, with y-value the same as the start   */
+            x = ADD_LONG( 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 ) ||
+                 cff_check_points( builder, 6 )           )
+              goto Fail;
+
+            /* record the starting point's y-position for later use */
+            start_y = y;
+
+            /* first control point */
+            x = ADD_LONG( x, args[0] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* second control point */
+            x = ADD_LONG( x, args[1] );
+            y = ADD_LONG( 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 = ADD_LONG( 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 = ADD_LONG( x, args[4] );
+            cff_builder_add_point( builder, x, y, 0 );
+
+            /* fourth control point */
+            x = ADD_LONG( 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 = ADD_LONG( 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 ) ||
+                 cff_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    = ADD_LONG( dx, temp[0] );
+              dy    = ADD_LONG( 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 = ADD_LONG( x, args[0] );
+              y = ADD_LONG( 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 = ADD_LONG( x, args[0] );
+              y = start_y;
+            }
+            else
+            {
+              x = start_x;
+              y = ADD_LONG( 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 ) ||
+                 cff_check_points( builder, 6 )           )
+              goto Fail;
+
+            for ( count = 6; count > 0; count-- )
+            {
+              x = ADD_LONG( x, args[0] );
+              y = ADD_LONG( 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:
+          /* in dictionaries, `endchar' simply indicates end of data */
+          if ( in_dict )
+            return error;
+
+          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
+          {
+            cff_builder_close_contour( builder );
+
+            /* close hints recording session */
+            if ( hinter )
+            {
+              if ( hinter->close( hinter->hints,
+                                  (FT_UInt)builder->current->n_points ) )
+                goto Syntax_Error;
+
+              /* apply hints to the loaded glyph outline now */
+              error = hinter->apply( hinter->hints,
+                                     builder->current,
+                                     (PSH_Globals)builder->hints_globals,
+                                     decoder->hint_mode );
+              if ( error )
+                goto Fail;
+            }
+
+            /* 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 )
+          {
+            if ( args[0] == FT_LONG_MIN )
+              args[0] = FT_LONG_MAX;
+            else
+              args[0] = -args[0];
+          }
+          args++;
+          break;
+
+        case cff_op_add:
+          FT_TRACE4(( " add\n" ));
+
+          args[0] = ADD_LONG( args[0], args[1] );
+          args++;
+          break;
+
+        case cff_op_sub:
+          FT_TRACE4(( " sub\n" ));
+
+          args[0] = SUB_LONG( 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" ));
+
+          if ( args[0] == FT_LONG_MIN )
+            args[0] = FT_LONG_MAX;
+          args[0] = -args[0];
+          args++;
+          break;
+
+        case cff_op_random:
+          FT_TRACE4(( " random\n" ));
+
+          /* only use the lower 16 bits of `random'  */
+          /* to generate a number in the range (0;1] */
+          args[0] = (FT_Fixed)
+                      ( ( decoder->current_subfont->random & 0xFFFF ) + 1 );
+          args++;
+
+          decoder->current_subfont->random =
+            cff_random( decoder->current_subfont->random );
+          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_Fixed  root = args[0];
+            FT_Fixed  new_root;
+
+
+            for (;;)
+            {
+              new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1;
+              if ( new_root == root )
+                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" ));
+
+            /* the Type2 specification before version 16-March-2000 */
+            /* didn't give a hard-coded size limit of the temporary */
+            /* storage array; instead, an argument of the           */
+            /* `MultipleMaster' operator set the size               */
+            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:
+          /* this operator was removed from the Type2 specification */
+          /* in version 16-March-2000                               */
+
+          /* since we currently don't handle interpolation of multiple */
+          /* master fonts, this is a no-op                             */
+          FT_TRACE4(( " store\n" ));
+          break;
+
+        case cff_op_load:
+          /* this operator was removed from the Type2 specification */
+          /* in version 16-March-2000                               */
+          {
+            FT_Int  reg_idx = (FT_Int)args[0];
+            FT_Int  idx     = (FT_Int)args[1];
+            FT_Int  count   = (FT_Int)args[2];
+
+
+            FT_TRACE4(( " load\n" ));
+
+            /* since we currently don't handle interpolation of multiple */
+            /* master fonts, we store a vector [1 0 0 ...] in the        */
+            /* temporary storage array regardless of the Registry index  */
+            if ( reg_idx >= 0 && reg_idx <= 2             &&
+                 idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS &&
+                 count >= 0 && count <= num_axes          )
+            {
+              FT_Int  end, i;
+
+
+              end = FT_MIN( idx + count, CFF_MAX_TRANS_ELEMENTS );
+
+              if ( idx < end )
+                decoder->buildchar[idx] = 1 << 16;
+
+              for ( i = idx + 1; i < end; i++ )
+                decoder->buildchar[i] = 0;
+            }
+          }
+          break;
+
+        case cff_op_blend:
+          /* this operator was removed from the Type2 specification */
+          /* in version 16-March-2000                               */
+          {
+            FT_Int  num_results = (FT_Int)( args[0] >> 16 );
+
+
+            FT_TRACE4(( " blend\n" ));
+
+            if ( num_results < 0 )
+              goto Syntax_Error;
+
+            if ( num_results * (FT_Int)num_designs > num_args )
+              goto Stack_Underflow;
+
+            /* since we currently don't handle interpolation of multiple */
+            /* master fonts, return the `num_results' values of the      */
+            /* first master                                              */
+            args     -= num_results * ( num_designs - 1 );
+            num_args -= num_results * ( num_designs - 1 );
+          }
+          break;
+
+        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 =
+            ADD_LONG( decoder->nominal_width, ( args[1] >> 16 ) );
+
+          decoder->builder.left_bearing.x = args[0];
+          decoder->builder.left_bearing.y = 0;
+
+          x    = ADD_LONG( 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 =
+            ADD_LONG( decoder->nominal_width, ( args[2] >> 16 ) );
+
+          decoder->builder.left_bearing.x = args[0];
+          decoder->builder.left_bearing.y = args[1];
+
+          x    = ADD_LONG( decoder->builder.pos_x, args[0] );
+          y    = ADD_LONG( 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    = ADD_LONG( decoder->builder.pos_x, args[0] );
+          y    = ADD_LONG( 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_not:
+          {
+            FT_Fixed  cond = !args[0];
+
+
+            FT_TRACE4(( " not\n" ));
+
+            args[0] = cond ? 0x10000L : 0;
+            args++;
+          }
+          break;
+
+        case cff_op_eq:
+          {
+            FT_Fixed  cond = ( args[0] == args[1] );
+
+
+            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 (idx %d, entering level %d)\n",
+                        idx,
+                        zone - decoder->zones + 1 ));
+
+            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 (idx %d, entering level %d)\n",
+                        idx,
+                        zone - decoder->zones + 1 ));
+
+            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 (leaving level %d)\n",
+                      decoder->zone - decoder->zones ));
+
+          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:
+          FT_ERROR(( "Unimplemented opcode: %d", ip[-1] ));
+
+          if ( ip[-1] == 12 )
+            FT_ERROR(( " %d", ip[0] ));
+          FT_ERROR(( "\n" ));
+
+          return FT_THROW( 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;
+
+  MM_Error:
+    FT_TRACE4(( "cff_decoder_parse_charstrings:"
+                " invalid opcode found in top DICT charstring\n"));
+    return FT_THROW( Invalid_File_Format );
+
+  Syntax_Error:
+    FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" ));
+    return FT_THROW( Invalid_File_Format );
+
+  Stack_Underflow:
+    FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" ));
+    return FT_THROW( Too_Few_Arguments );
+
+  Stack_Overflow:
+    FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" ));
+    return FT_THROW( Stack_Overflow );
+  }
+
+#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <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_Decoder_Get_Glyph_Callback   get_callback,
+                    CFF_Decoder_Free_Glyph_Callback  free_callback )
+  {
+    CFF_Font  cff = (CFF_Font)face->extra.data;
+
+
+    /* clear everything */
+    FT_ZERO( 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;
+
+    decoder->get_glyph_callback  = get_callback;
+    decoder->free_glyph_callback = free_callback;
+  }
+
+
+  /* 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   = FT_Err_Ok;
+
+    FT_Service_CFFLoad  cffload = (FT_Service_CFFLoad)cff->cffload;
+
+
+    /* manage CID fonts */
+    if ( cff->num_subfonts )
+    {
+      FT_Byte  fd_index = cffload->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 = FT_THROW( Invalid_File_Format );
+        goto Exit;
+      }
+
+      FT_TRACE3(( "  in subfont %d:\n", fd_index ));
+
+      sub = cff->subfonts[fd_index];
+
+      if ( builder->hints_funcs && size )
+      {
+        FT_Size       ftsize   = FT_SIZE( size );
+        CFF_Internal  internal = (CFF_Internal)ftsize->internal->module_data;
+
+
+        /* for CFFs without subfonts, this value has already been set */
+        builder->hints_globals = (void *)internal->subfonts[fd_index];
+      }
+    }
+
+    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;
+
+    decoder->current_subfont = sub;
+
+  Exit:
+    return error;
+  }
+
+
+/* END */
diff --git a/src/psaux/cffdecode.h b/src/psaux/cffdecode.h
new file mode 100644 (file)
index 0000000..0d4f5fe
--- /dev/null
@@ -0,0 +1,64 @@
+/***************************************************************************/
+/*                                                                         */
+/*  cffdecode.h                                                            */
+/*                                                                         */
+/*    PostScript CFF (Type 2) decoding routines (specification).           */
+/*                                                                         */
+/*  Copyright 2017-2018 by                                                 */
+/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
+/*                                                                         */
+/*  This file is part of the FreeType project, and may only be used,       */
+/*  modified, and distributed under the terms of the FreeType project      */
+/*  license, LICENSE.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 CFFDECODE_H_
+#define CFFDECODE_H_
+
+
+#include <ft2build.h>
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
+
+FT_BEGIN_HEADER
+
+  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,
+                    CFF_Decoder_Get_Glyph_Callback   get_callback,
+                    CFF_Decoder_Free_Glyph_Callback  free_callback );
+
+  FT_LOCAL( FT_Error )
+  cff_decoder_prepare( CFF_Decoder*  decoder,
+                       CFF_Size      size,
+                       FT_UInt       glyph_index );
+
+
+  FT_LOCAL( FT_Int )
+  cff_lookup_glyph_by_stdcharcode( CFF_Font  cff,
+                                   FT_Int    charcode );
+
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+  FT_LOCAL( FT_Error )
+  cff_decoder_parse_charstrings( CFF_Decoder*  decoder,
+                                 FT_Byte*      charstring_base,
+                                 FT_ULong      charstring_len,
+                                 FT_Bool       in_dict );
+#endif
+
+
+FT_END_HEADER
+
+#endif
+
+
+/* END */
index c70a227..6584d07 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
similarity index 98%
rename from src/cff/cf2arrst.c
rename to src/psaux/psarrst.c
index 6796450..a878094 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2arrst.c                                                             */
+/*  psarrst.c                                                              */
 /*                                                                         */
 /*    Adobe's code for Array Stacks (body).                                */
 /*                                                                         */
 /***************************************************************************/
 
 
-#include "cf2ft.h"
+#include "psft.h"
 #include FT_INTERNAL_DEBUG_H
 
-#include "cf2glue.h"
-#include "cf2arrst.h"
+#include "psglue.h"
+#include "psarrst.h"
 
-#include "cf2error.h"
+#include "pserror.h"
 
 
   /*
similarity index 96%
rename from src/cff/cf2arrst.h
rename to src/psaux/psarrst.h
index 3c21a3b..b3568eb 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2arrst.h                                                             */
+/*  psarrst.h                                                              */
 /*                                                                         */
 /*    Adobe's code for Array Stacks (specification).                       */
 /*                                                                         */
 /***************************************************************************/
 
 
-#ifndef CF2ARRST_H_
-#define CF2ARRST_H_
+#ifndef PSARRST_H_
+#define PSARRST_H_
 
 
-#include "cf2error.h"
+#include "pserror.h"
 
 
 FT_BEGIN_HEADER
@@ -94,7 +94,7 @@ FT_BEGIN_HEADER
 FT_END_HEADER
 
 
-#endif /* CF2ARRST_H_ */
+#endif /* PSARRST_H_ */
 
 
 /* END */
index c373aa7..fb447fc 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType auxiliary PostScript driver component (body only).          */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 #include "psobjs.c"
 #include "t1cmap.c"
 #include "t1decode.c"
+#include "cffdecode.c"
+
+#include "psarrst.c"
+#include "psblues.c"
+#include "pserror.c"
+#include "psfont.c"
+#include "psft.c"
+#include "pshints.c"
+#include "psintrp.c"
+#include "psread.c"
+#include "psstack.c"
 
 
 /* END */
index 1d7ac60..cc33fd2 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PS auxiliary module error codes (specification only).                */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 1f589ce..ee49708 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType auxiliary PostScript module implementation (body).          */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -21,6 +21,8 @@
 #include "psobjs.h"
 #include "t1decode.h"
 #include "t1cmap.h"
+#include "psft.h"
+#include "cffdecode.h"
 
 #ifndef T1_CONFIG_OPTION_NO_AFM
 #include "afmparse.h"
 
 
   FT_CALLBACK_TABLE_DEF
+  const PS_Builder_FuncsRec  ps_builder_funcs =
+  {
+    ps_builder_init,          /* init */
+    ps_builder_done           /* done */
+  };
+
+
+  FT_CALLBACK_TABLE_DEF
   const T1_Builder_FuncsRec  t1_builder_funcs =
   {
     t1_builder_init,          /* init */
   FT_CALLBACK_TABLE_DEF
   const T1_Decoder_FuncsRec  t1_decoder_funcs =
   {
-    t1_decoder_init,              /* init              */
-    t1_decoder_done,              /* done              */
-    t1_decoder_parse_charstrings  /* parse_charstrings */
+    t1_decoder_init,               /* init                  */
+    t1_decoder_done,               /* done                  */
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+    t1_decoder_parse_charstrings,  /* parse_charstrings_old */
+#else
+    t1_decoder_parse_metrics,      /* parse_metrics         */
+#endif
+    cf2_decoder_parse_charstrings  /* parse_charstrings     */
   };
 
 
   };
 
 
+  FT_CALLBACK_TABLE_DEF
+  const CFF_Builder_FuncsRec  cff_builder_funcs =
+  {
+    cff_builder_init,          /* init */
+    cff_builder_done,          /* done */
+
+    cff_check_points,          /* check_points  */
+    cff_builder_add_point,     /* add_point     */
+    cff_builder_add_point1,    /* add_point1    */
+    cff_builder_add_contour,   /* add_contour   */
+    cff_builder_start_point,   /* start_point   */
+    cff_builder_close_contour  /* close_contour */
+  };
+
+
+  FT_CALLBACK_TABLE_DEF
+  const CFF_Decoder_FuncsRec  cff_decoder_funcs =
+  {
+    cff_decoder_init,              /* init    */
+    cff_decoder_prepare,           /* prepare */
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+    cff_decoder_parse_charstrings, /* parse_charstrings_old */
+#endif
+    cf2_decoder_parse_charstrings  /* parse_charstrings     */
+  };
+
+
   static
   const PSAux_Interface  psaux_interface =
   {
     &t1_builder_funcs,
     &t1_decoder_funcs,
     t1_decrypt,
+    cff_random,
+    ps_decoder_init,
+    t1_make_subfont,
 
     (const T1_CMap_ClassesRec*) &t1_cmap_classes,
 
 #else
     0,
 #endif
+
+    &cff_decoder_funcs,
   };
 
 
index 926f37e..f30978f 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType auxiliary PostScript module implementation (specification). */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,6 +23,8 @@
 #include <ft2build.h>
 #include FT_MODULE_H
 
+#include FT_INTERNAL_POSTSCRIPT_AUX_H
+
 
 FT_BEGIN_HEADER
 
@@ -31,6 +33,13 @@ FT_BEGIN_HEADER
 #endif
 
 
+  FT_CALLBACK_TABLE
+  const CFF_Builder_FuncsRec  cff_builder_funcs;
+
+  FT_CALLBACK_TABLE
+  const PS_Builder_FuncsRec   ps_builder_funcs;
+
+
   FT_EXPORT_VAR( const FT_Module_Class )  psaux_driver_class;
 
 
similarity index 91%
rename from src/cff/cf2blues.c
rename to src/psaux/psblues.c
index 250f89e..ae39d03 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2blues.c                                                             */
+/*  psblues.c                                                              */
 /*                                                                         */
 /*    Adobe's code for handling Blue Zones (body).                         */
 /*                                                                         */
 /***************************************************************************/
 
 
-#include "cf2ft.h"
+#include "psft.h"
 #include FT_INTERNAL_DEBUG_H
 
-#include "cf2blues.h"
-#include "cf2hints.h"
-#include "cf2font.h"
+#include "psblues.h"
+#include "pshints.h"
+#include "psfont.h"
 
 
   /*************************************************************************/
@@ -67,7 +67,7 @@
                   CF2_Font   font )
   {
     /* pointer to parsed font object */
-    CFF_Decoder*  decoder = font->decoder;
+    PS_Decoder*  decoder = font->decoder;
 
     CF2_Fixed  zoneHeight;
     CF2_Fixed  maxZoneHeight = 0;
       blues->zone[blues->count].csTopEdge =
         cf2_blueToFixed( blueValues[i + 1] );
 
-      zoneHeight = blues->zone[blues->count].csTopEdge -
-                   blues->zone[blues->count].csBottomEdge;
+      zoneHeight = SUB_INT32( blues->zone[blues->count].csTopEdge,
+                              blues->zone[blues->count].csBottomEdge );
 
       if ( zoneHeight < 0 )
       {
       blues->zone[blues->count].csTopEdge =
         cf2_blueToFixed( otherBlues[i + 1] );
 
-      zoneHeight = blues->zone[blues->count].csTopEdge -
-                   blues->zone[blues->count].csBottomEdge;
+      zoneHeight = SUB_INT32( blues->zone[blues->count].csTopEdge,
+                              blues->zone[blues->count].csBottomEdge );
 
       if ( zoneHeight < 0 )
       {
           /* top edge */
           flatFamilyEdge = cf2_blueToFixed( familyOtherBlues[j + 1] );
 
-          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+          diff = cf2_fixedAbs( SUB_INT32( flatEdge, flatFamilyEdge ) );
 
           if ( diff < minDiff && diff < csUnitsPerPixel )
           {
           /* top edge */
           flatFamilyEdge = cf2_blueToFixed( familyBlues[1] );
 
-          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+          diff = cf2_fixedAbs( SUB_INT32( flatEdge, flatFamilyEdge ) );
 
           if ( diff < minDiff && diff < csUnitsPerPixel )
             blues->zone[i].csFlatEdge = flatFamilyEdge;
           /* adjust edges of top zone upward by twice darkening amount */
           flatFamilyEdge += 2 * font->darkenY;      /* bottom edge */
 
-          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
+          diff = cf2_fixedAbs( SUB_INT32( flatEdge, flatFamilyEdge ) );
 
           if ( diff < minDiff && diff < csUnitsPerPixel )
           {
       /* Note: constant changed from 0.5 to 0.6 to avoid a problem with */
       /*       10ppem Arial                                             */
 
-      blues->boost = cf2_floatToFixed( .6 ) -
-                       FT_MulDiv( cf2_floatToFixed ( .6 ),
+      blues->boost = cf2_doubleToFixed( .6 ) -
+                       FT_MulDiv( cf2_doubleToFixed ( .6 ),
                                   blues->scale,
                                   blues->blueScale );
       if ( blues->boost > 0x7FFF )
       if ( blues->zone[i].bottomZone           &&
            cf2_hint_isBottom( bottomHintEdge ) )
       {
-        if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=
-               bottomHintEdge->csCoord                   &&
+        if ( SUB_INT32( blues->zone[i].csBottomEdge, csFuzz ) <=
+               bottomHintEdge->csCoord                           &&
              bottomHintEdge->csCoord <=
-               ( blues->zone[i].csTopEdge + csFuzz )     )
+               ADD_INT32( blues->zone[i].csTopEdge, csFuzz )     )
         {
           /* bottom edge captured by bottom zone */
 
           if ( blues->suppressOvershoot )
             dsNew = blues->zone[i].dsFlatEdge;
 
-          else if ( ( blues->zone[i].csTopEdge - bottomHintEdge->csCoord ) >=
+          else if ( SUB_INT32( blues->zone[i].csTopEdge,
+                               bottomHintEdge->csCoord ) >=
                       blues->blueShift )
           {
             /* guarantee minimum of 1 pixel overshoot */
             dsNew = cf2_fixedRound( bottomHintEdge->dsCoord );
           }
 
-          dsMove   = dsNew - bottomHintEdge->dsCoord;
+          dsMove   = SUB_INT32( dsNew, bottomHintEdge->dsCoord );
           captured = TRUE;
 
           break;
 
       if ( !blues->zone[i].bottomZone && cf2_hint_isTop( topHintEdge ) )
       {
-        if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=
-               topHintEdge->csCoord                      &&
+        if ( SUB_INT32( blues->zone[i].csBottomEdge, csFuzz ) <=
+               topHintEdge->csCoord                              &&
              topHintEdge->csCoord <=
-               ( blues->zone[i].csTopEdge + csFuzz )     )
+               ADD_INT32( blues->zone[i].csTopEdge, csFuzz )     )
         {
           /* top edge captured by top zone */
 
           if ( blues->suppressOvershoot )
             dsNew = blues->zone[i].dsFlatEdge;
 
-          else if ( ( topHintEdge->csCoord - blues->zone[i].csBottomEdge ) >=
+          else if ( SUB_INT32( topHintEdge->csCoord,
+                               blues->zone[i].csBottomEdge ) >=
                       blues->blueShift )
           {
             /* guarantee minimum of 1 pixel overshoot */
             dsNew = cf2_fixedRound( topHintEdge->dsCoord );
           }
 
-          dsMove   = dsNew - topHintEdge->dsCoord;
+          dsMove   = SUB_INT32( dsNew, topHintEdge->dsCoord );
           captured = TRUE;
 
           break;
       /* move both edges and flag them `locked' */
       if ( cf2_hint_isValid( bottomHintEdge ) )
       {
-        bottomHintEdge->dsCoord += dsMove;
+        bottomHintEdge->dsCoord = ADD_INT32( bottomHintEdge->dsCoord,
+                                             dsMove );
         cf2_hint_lock( bottomHintEdge );
       }
 
       if ( cf2_hint_isValid( topHintEdge ) )
       {
-        topHintEdge->dsCoord += dsMove;
+        topHintEdge->dsCoord = ADD_INT32( topHintEdge->dsCoord, dsMove );
         cf2_hint_lock( topHintEdge );
       }
     }
similarity index 97%
rename from src/cff/cf2blues.h
rename to src/psaux/psblues.h
index 96fb60f..25ef684 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2blues.h                                                             */
+/*  psblues.h                                                              */
 /*                                                                         */
 /*    Adobe's code for handling Blue Zones (specification).                */
 /*                                                                         */
    */
 
 
-#ifndef CF2BLUES_H_
-#define CF2BLUES_H_
+#ifndef PSBLUES_H_
+#define PSBLUES_H_
 
 
-#include "cf2glue.h"
+#include "psglue.h"
 
 
 FT_BEGIN_HEADER
@@ -111,7 +111,7 @@ FT_BEGIN_HEADER
    * Constant used for hint adjustment and for synthetic em box hint
    * placement.
    */
-#define CF2_MIN_COUNTER  cf2_floatToFixed( 0.5 )
+#define CF2_MIN_COUNTER  cf2_doubleToFixed( 0.5 )
 
 
   /* shared typedef is in cf2glue.h */
@@ -179,7 +179,7 @@ FT_BEGIN_HEADER
 FT_END_HEADER
 
 
-#endif /* CF2BLUES_H_ */
+#endif /* PSBLUES_H_ */
 
 
 /* END */
index b092482..a033850 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Some convenience conversions (body).                                 */
 /*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
       p++;
       if ( p == limit )
         goto Bad;
+
+      /* only a single sign is allowed */
+      if ( *p == '-' || *p == '+' )
+        return 0;
     }
 
     num_limit = 0x7FFFFFFFL / base;
       p++;
       if ( p == limit )
         goto Bad;
+
+      /* only a single sign is allowed */
+      if ( *p == '-' || *p == '+' )
+        return 0;
     }
 
     /* read the integer part */
index cab254a..d643ffc 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Some convenience conversions (specification).                        */
 /*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
similarity index 96%
rename from src/cff/cf2error.c
rename to src/psaux/pserror.c
index e3dd69f..9169e52 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2error.c                                                             */
+/*  pserror.c                                                              */
 /*                                                                         */
 /*    Adobe's code for error handling (body).                              */
 /*                                                                         */
@@ -36,8 +36,8 @@
 /***************************************************************************/
 
 
-#include "cf2ft.h"
-#include "cf2error.h"
+#include "psft.h"
+#include "pserror.h"
 
 
   FT_LOCAL_DEF( void )
similarity index 96%
rename from src/cff/cf2error.h
rename to src/psaux/pserror.h
index d2c770d..13d5206 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2error.h                                                             */
+/*  pserror.h                                                              */
 /*                                                                         */
 /*    Adobe's code for error handling (specification).                     */
 /*                                                                         */
@@ -36,8 +36,8 @@
 /***************************************************************************/
 
 
-#ifndef CF2ERROR_H_
-#define CF2ERROR_H_
+#ifndef PSERROR_H_
+#define PSERROR_H_
 
 
 #include FT_MODULE_ERRORS_H
@@ -50,7 +50,7 @@
 
 
 #include FT_ERRORS_H
-#include "cf2ft.h"
+#include "psft.h"
 
 
 FT_BEGIN_HEADER
@@ -113,7 +113,7 @@ FT_BEGIN_HEADER
 FT_END_HEADER
 
 
-#endif /* CF2ERROR_H_ */
+#endif /* PSERROR_H_ */
 
 
 /* END */
similarity index 95%
rename from src/cff/cf2fixed.h
rename to src/psaux/psfixed.h
index 2e4b503..219589e 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2fixed.h                                                             */
+/*  psfixed.h                                                              */
 /*                                                                         */
 /*    Adobe's code for Fixed Point Mathematics (specification only).       */
 /*                                                                         */
@@ -36,8 +36,8 @@
 /***************************************************************************/
 
 
-#ifndef CF2FIXED_H_
-#define CF2FIXED_H_
+#ifndef PSFIXED_H_
+#define PSFIXED_H_
 
 
 FT_BEGIN_HEADER
@@ -63,10 +63,10 @@ FT_BEGIN_HEADER
           ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )
 #define cf2_fixedRound( x )                                              \
           ( (CF2_Fixed)( ( (FT_UInt32)(x) + 0x8000U ) & 0xFFFF0000UL ) )
-#define cf2_floatToFixed( f )                                            \
+#define cf2_doubleToFixed( f )                                           \
           ( (CF2_Fixed)( (f) * 65536.0 + 0.5 ) )
 #define cf2_fixedAbs( x )                                                \
-          ( (x) < 0 ? -(x) : (x) )
+          ( (x) < 0 ? NEG_INT32( x ) : (x) )
 #define cf2_fixedFloor( x )                                              \
           ( (CF2_Fixed)( (FT_UInt32)(x) & 0xFFFF0000UL ) )
 #define cf2_fixedFraction( x )                                           \
@@ -89,7 +89,7 @@ FT_BEGIN_HEADER
 FT_END_HEADER
 
 
-#endif /* CF2FIXED_H_ */
+#endif /* PSFIXED_H_ */
 
 
 /* END */
similarity index 91%
rename from src/cff/cf2font.c
rename to src/psaux/psfont.c
index a86e361..dde67a7 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2font.c                                                              */
+/*  psfont.c                                                               */
 /*                                                                         */
 /*    Adobe's code for font instances (body).                              */
 /*                                                                         */
 #include <ft2build.h>
 #include FT_INTERNAL_CALC_H
 
-#include "cf2ft.h"
+#include "psft.h"
 
-#include "cf2glue.h"
-#include "cf2font.h"
-#include "cf2error.h"
-#include "cf2intrp.h"
+#include "psglue.h"
+#include "psfont.h"
+#include "pserror.h"
+#include "psintrp.h"
 
 
   /* Compute a stem darkening amount in character space. */
       return;
 
     /* protect against range problems and divide by zero */
-    if ( emRatio < cf2_floatToFixed( .01 ) )
+    if ( emRatio < cf2_doubleToFixed( .01 ) )
       return;
 
     if ( stemDarkened )
                   const CF2_Matrix*  transform )
   {
     /* pointer to parsed font object */
-    CFF_Decoder*  decoder = font->decoder;
+    PS_Decoder*  decoder = font->decoder;
 
     FT_Bool  needExtraSetup = FALSE;
 
     CF2_UInt   lenNormalizedV = 0;
     FT_Fixed*  normalizedV    = NULL;
 
-
     /* clear previous error */
     font->error = FT_Err_Ok;
 
       needExtraSetup    = TRUE;
     }
 
-    /* check for variation vectors */
-    vstore        = cf2_getVStore( decoder );
-    hasVariations = ( vstore->dataCount != 0 );
-
-    if ( hasVariations )
+    if ( !font->isT1 )
     {
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-      /* check whether Private DICT in this subfont needs to be reparsed */
-      font->error = cf2_getNormalizedVector( decoder,
-                                             &lenNormalizedV,
-                                             &normalizedV );
-      if ( font->error )
-        return;
+      FT_Service_CFFLoad  cffload = (FT_Service_CFFLoad)font->cffload;
+
+
+      /* check for variation vectors */
+      vstore        = cf2_getVStore( decoder );
+      hasVariations = ( vstore->dataCount != 0 );
 
-      if ( cff_blend_check_vector( &subFont->blend,
-                                   subFont->private_dict.vsindex,
-                                   lenNormalizedV,
-                                   normalizedV ) )
+      if ( hasVariations )
       {
-        /* blend has changed, reparse */
-        cff_load_private_dict( decoder->cff,
-                               subFont,
-                               lenNormalizedV,
-                               normalizedV );
-        needExtraSetup = TRUE;
-      }
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+        /* check whether Private DICT in this subfont needs to be reparsed */
+        font->error = cf2_getNormalizedVector( decoder,
+                                               &lenNormalizedV,
+                                               &normalizedV );
+        if ( font->error )
+          return;
+
+        if ( cffload->blend_check_vector( &subFont->blend,
+                                          subFont->private_dict.vsindex,
+                                          lenNormalizedV,
+                                          normalizedV ) )
+        {
+          /* blend has changed, reparse */
+          cffload->load_private_dict( decoder->cff,
+                                      subFont,
+                                      lenNormalizedV,
+                                      normalizedV );
+          needExtraSetup = TRUE;
+        }
 #endif
 
-      /* copy from subfont */
-      font->blend.font = subFont->blend.font;
+        /* copy from subfont */
+        font->blend.font = subFont->blend.font;
 
-      /* clear state of charstring blend */
-      font->blend.usedBV = FALSE;
+        /* clear state of charstring blend */
+        font->blend.usedBV = FALSE;
 
-      /* initialize value for charstring */
-      font->vsindex = subFont->private_dict.vsindex;
+        /* initialize value for charstring */
+        font->vsindex = subFont->private_dict.vsindex;
 
-      /* store vector inputs for blends in charstring */
-      font->lenNDV = lenNormalizedV;
-      font->NDV    = normalizedV;
+        /* store vector inputs for blends in charstring */
+        font->lenNDV = lenNormalizedV;
+        font->NDV    = normalizedV;
+      }
     }
 
     /* if ppem has changed, we need to recompute some cached data         */
       /* choose a constant for StdHW that depends on font contrast       */
       stdHW = cf2_getStdHW( decoder );
 
-      if ( stdHW > 0 && font->stdVW > 2 * stdHW )
+      if ( stdHW > 0 && font->stdVW > MUL_INT32( 2, stdHW ) )
         font->stdHW = FT_DivFix( cf2_intToFixed( 75 ), emRatio );
       else
       {
similarity index 94%
rename from src/cff/cf2font.h
rename to src/psaux/psfont.h
index 17ecd17..e611ac4 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2font.h                                                              */
+/*  psfont.h                                                               */
 /*                                                                         */
 /*    Adobe's code for font instances (specification).                     */
 /*                                                                         */
 /***************************************************************************/
 
 
-#ifndef CF2FONT_H_
-#define CF2FONT_H_
+#ifndef PSFONT_H_
+#define PSFONT_H_
 
 
-#include "cf2ft.h"
-#include "cf2blues.h"
-#include "cffload.h"
+#include FT_SERVICE_CFF_TABLE_LOAD_H
+
+#include "psft.h"
+#include "psblues.h"
 
 
 FT_BEGIN_HEADER
@@ -64,6 +65,7 @@ FT_BEGIN_HEADER
     FT_Memory  memory;
     FT_Error   error;     /* shared error for this instance */
 
+    FT_Bool             isT1;
     FT_Bool             isCFF2;
     CF2_RenderingFlags  renderingFlags;
 
@@ -89,7 +91,7 @@ FT_BEGIN_HEADER
 
     /* FreeType related members */
     CF2_OutlineRec  outline;       /* freetype glyph outline functions */
-    CFF_Decoder*    decoder;
+    PS_Decoder*     decoder;
     CFF_SubFont     lastSubfont;              /* FreeType parsed data; */
                                               /* top font or subfont   */
 
@@ -111,6 +113,8 @@ FT_BEGIN_HEADER
                                            /* counterclockwise winding */
 
     CF2_BluesRec  blues;                         /* computed zone data */
+
+    FT_Service_CFFLoad  cffload;           /* pointer to cff functions */
   };
 
 
@@ -124,7 +128,7 @@ FT_BEGIN_HEADER
 FT_END_HEADER
 
 
-#endif /* CF2FONT_H_ */
+#endif /* PSFONT_H_ */
 
 
 /* END */
similarity index 65%
rename from src/cff/cf2ft.c
rename to src/psaux/psft.c
index eb8472f..1f75017 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2ft.c                                                                */
+/*  psft.c                                                                 */
 /*                                                                         */
 /*    FreeType Glue Component to Adobe's Interpreter (body).               */
 /*                                                                         */
 /***************************************************************************/
 
 
-#include "cf2ft.h"
+#include "psft.h"
 #include FT_INTERNAL_DEBUG_H
 
-#include "cf2font.h"
-#include "cf2error.h"
+#include "psfont.h"
+#include "pserror.h"
+#include "psobjs.h"
+#include "cffdecode.h"
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+#include FT_MULTIPLE_MASTERS_H
+#include FT_SERVICE_MULTIPLE_MASTERS_H
+#endif
+
+#include FT_SERVICE_CFF_TABLE_LOAD_H
 
 
 #define CF2_MAX_SIZE  cf2_intToFixed( 2000 )    /* max ppem */
   cf2_setGlyphWidth( CF2_Outline  outline,
                      CF2_Fixed    width )
   {
-    CFF_Decoder*  decoder = outline->decoder;
+    PS_Decoder*  decoder = outline->decoder;
 
 
     FT_ASSERT( decoder );
 
-    decoder->glyph_width = cf2_fixedToInt( width );
+    if ( !decoder->builder.is_t1 )
+      *decoder->glyph_width = cf2_fixedToInt( width );
   }
 
 
                       const CF2_CallbackParams  params )
   {
     /* downcast the object pointer */
-    CF2_Outline   outline = (CF2_Outline)callbacks;
-    CFF_Builder*  builder;
+    CF2_Outline  outline = (CF2_Outline)callbacks;
+    PS_Builder*  builder;
 
     (void)params;        /* only used in debug mode */
 
     builder = &outline->decoder->builder;
 
     /* note: two successive moves simply close the contour twice */
-    cff_builder_close_contour( builder );
+    ps_builder_close_contour( builder );
     builder->path_begun = 0;
   }
 
     FT_Error  error;
 
     /* downcast the object pointer */
-    CF2_Outline   outline = (CF2_Outline)callbacks;
-    CFF_Builder*  builder;
+    CF2_Outline  outline = (CF2_Outline)callbacks;
+    PS_Builder*  builder;
 
 
     FT_ASSERT( outline && outline->decoder );
     {
       /* record the move before the line; also check points and set */
       /* `path_begun'                                               */
-      error = cff_builder_start_point( builder,
-                                       params->pt0.x,
-                                       params->pt0.y );
+      error = ps_builder_start_point( builder,
+                                      params->pt0.x,
+                                      params->pt0.y );
       if ( error )
       {
         if ( !*callbacks->error )
       }
     }
 
-    /* `cff_builder_add_point1' includes a check_points call for one point */
-    error = cff_builder_add_point1( builder,
-                                    params->pt1.x,
-                                    params->pt1.y );
+    /* `ps_builder_add_point1' includes a check_points call for one point */
+    error = ps_builder_add_point1( builder,
+                                   params->pt1.x,
+                                   params->pt1.y );
     if ( error )
     {
       if ( !*callbacks->error )
     FT_Error  error;
 
     /* downcast the object pointer */
-    CF2_Outline   outline = (CF2_Outline)callbacks;
-    CFF_Builder*  builder;
+    CF2_Outline  outline = (CF2_Outline)callbacks;
+    PS_Builder*  builder;
 
 
     FT_ASSERT( outline && outline->decoder );
     {
       /* record the move before the line; also check points and set */
       /* `path_begun'                                               */
-      error = cff_builder_start_point( builder,
-                                       params->pt0.x,
-                                       params->pt0.y );
+      error = ps_builder_start_point( builder,
+                                      params->pt0.x,
+                                      params->pt0.y );
       if ( error )
       {
         if ( !*callbacks->error )
     }
 
     /* prepare room for 3 points: 2 off-curve, 1 on-curve */
-    error = cff_check_points( builder, 3 );
+    error = ps_builder_check_points( builder, 3 );
     if ( error )
     {
       if ( !*callbacks->error )
       return;
     }
 
-    cff_builder_add_point( builder,
-                           params->pt1.x,
-                           params->pt1.y, 0 );
-    cff_builder_add_point( builder,
-                           params->pt2.x,
-                           params->pt2.y, 0 );
-    cff_builder_add_point( builder,
-                           params->pt3.x,
-                           params->pt3.y, 1 );
+    ps_builder_add_point( builder,
+                          params->pt1.x,
+                          params->pt1.y, 0 );
+    ps_builder_add_point( builder,
+                          params->pt2.x,
+                          params->pt2.y, 0 );
+    ps_builder_add_point( builder,
+                          params->pt3.x,
+                          params->pt3.y, 1 );
   }
 
 
 
   /* get scaling and hint flag from GlyphSlot */
   static void
-  cf2_getScaleAndHintFlag( CFF_Decoder*  decoder,
-                           CF2_Fixed*    x_scale,
-                           CF2_Fixed*    y_scale,
-                           FT_Bool*      hinted,
-                           FT_Bool*      scaled )
+  cf2_getScaleAndHintFlag( PS_Decoder*  decoder,
+                           CF2_Fixed*   x_scale,
+                           CF2_Fixed*   y_scale,
+                           FT_Bool*     hinted,
+                           FT_Bool*     scaled )
   {
     FT_ASSERT( decoder && decoder->builder.glyph );
 
 
     if ( *hinted )
     {
-      *x_scale = ( decoder->builder.glyph->x_scale + 32 ) / 64;
-      *y_scale = ( decoder->builder.glyph->y_scale + 32 ) / 64;
+      *x_scale = ADD_INT32( decoder->builder.glyph->x_scale, 32 ) / 64;
+      *y_scale = ADD_INT32( decoder->builder.glyph->y_scale, 32 ) / 64;
     }
     else
     {
   /* get units per em from `FT_Face' */
   /* TODO: should handle font matrix concatenation? */
   static FT_UShort
-  cf2_getUnitsPerEm( CFF_Decoder*  decoder )
+  cf2_getUnitsPerEm( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->builder.face );
-    FT_ASSERT( decoder->builder.face->root.units_per_EM );
+    FT_ASSERT( decoder->builder.face->units_per_EM );
 
-    return decoder->builder.face->root.units_per_EM;
+    return decoder->builder.face->units_per_EM;
   }
 
 
   /* Main entry point: Render one glyph. */
   FT_LOCAL_DEF( FT_Error )
-  cf2_decoder_parse_charstrings( CFF_Decoder*  decoder,
-                                 FT_Byte*      charstring_base,
-                                 FT_ULong      charstring_len )
+  cf2_decoder_parse_charstrings( PS_Decoder*  decoder,
+                                 FT_Byte*     charstring_base,
+                                 FT_ULong     charstring_len )
   {
     FT_Memory  memory;
     FT_Error   error = FT_Err_Ok;
     CF2_Font   font;
 
+    FT_Bool    is_t1 = decoder->builder.is_t1;
 
-    FT_ASSERT( decoder && decoder->cff );
+
+    FT_ASSERT( decoder &&
+               ( is_t1 || decoder->cff ) );
+
+    if ( is_t1 && !decoder->current_subfont )
+    {
+      FT_ERROR(( "cf2_decoder_parse_charstrings (Type 1): "
+                 "SubFont missing. Use `t1_make_subfont' first\n" ));
+      return FT_THROW( Invalid_Table );
+    }
 
     memory = decoder->builder.memory;
 
     /* CF2 data is saved here across glyphs */
-    font = (CF2_Font)decoder->cff->cf2_instance.data;
+    font = (CF2_Font)decoder->cf2_instance->data;
 
     /* on first glyph, allocate instance structure */
-    if ( !decoder->cff->cf2_instance.data )
+    if ( !decoder->cf2_instance->data )
     {
-      decoder->cff->cf2_instance.finalizer =
+      decoder->cf2_instance->finalizer =
         (FT_Generic_Finalizer)cf2_free_instance;
 
-      if ( FT_ALLOC( decoder->cff->cf2_instance.data,
+      if ( FT_ALLOC( decoder->cf2_instance->data,
                      sizeof ( CF2_FontRec ) ) )
         return FT_THROW( Out_Of_Memory );
 
-      font = (CF2_Font)decoder->cff->cf2_instance.data;
+      font = (CF2_Font)decoder->cf2_instance->data;
 
       font->memory = memory;
 
+      if ( !is_t1 )
+        font->cffload = (FT_Service_CFFLoad)decoder->cff->cffload;
+
       /* initialize a client outline, to be shared by each glyph rendered */
       cf2_outline_init( &font->outline, font->memory, &font->error );
     }
     {
       /* build parameters for Adobe engine */
 
-      CFF_Builder*  builder = &decoder->builder;
-      CFF_Driver    driver  = (CFF_Driver)FT_FACE_DRIVER( builder->face );
+      PS_Builder*  builder = &decoder->builder;
+      PS_Driver    driver  = (PS_Driver)FT_FACE_DRIVER( builder->face );
 
       FT_Bool  no_stem_darkening_driver =
                  driver->no_stem_darkening;
       FT_Char  no_stem_darkening_font =
-                 builder->face->root.internal->no_stem_darkening;
+                 builder->face->internal->no_stem_darkening;
 
       /* local error */
       FT_Error       error2 = FT_Err_Ok;
                                &hinted,
                                &scaled );
 
-      /* copy isCFF2 boolean from TT_Face to CF2_Font */
-      font->isCFF2 = builder->face->is_cff2;
+      if ( is_t1 )
+        font->isCFF2 = FALSE;
+      else
+      {
+        /* copy isCFF2 boolean from TT_Face to CF2_Font */
+        font->isCFF2 = ((TT_Face)builder->face)->is_cff2;
+      }
+      font->isT1 = is_t1;
 
       font->renderingFlags = 0;
       if ( hinted )
 
   /* get pointer to current FreeType subfont (based on current glyphID) */
   FT_LOCAL_DEF( CFF_SubFont )
-  cf2_getSubfont( CFF_Decoder*  decoder )
+  cf2_getSubfont( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
 
   /* get pointer to VStore structure */
   FT_LOCAL_DEF( CFF_VStore )
-  cf2_getVStore( CFF_Decoder*  decoder )
+  cf2_getVStore( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->cff );
 
 
   /* get maxstack value from CFF2 Top DICT */
   FT_LOCAL_DEF( FT_UInt )
-  cf2_getMaxstack( CFF_Decoder*  decoder )
+  cf2_getMaxstack( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->cff );
 
   /*                                                          */
   /* Note: Uses FT_Fixed not CF2_Fixed for the vector.        */
   FT_LOCAL_DEF( FT_Error )
-  cf2_getNormalizedVector( CFF_Decoder*  decoder,
+  cf2_getNormalizedVector( PS_Decoder*  decoder,
                            CF2_UInt     *len,
                            FT_Fixed*    *vec )
   {
+    TT_Face                  face;
+    FT_Service_MultiMasters  mm;
+
+
     FT_ASSERT( decoder && decoder->builder.face );
     FT_ASSERT( vec && len );
+    FT_ASSERT( !decoder->builder.is_t1 );
 
-    return cff_get_var_blend( decoder->builder.face, len, NULL, vec, NULL );
+    face = (TT_Face)decoder->builder.face;
+    mm   = (FT_Service_MultiMasters)face->mm;
+
+    return mm->get_var_blend( FT_FACE( face ), len, NULL, vec, NULL );
   }
 #endif
 
 
   /* get `y_ppem' from `CFF_Size' */
   FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getPpemY( CFF_Decoder*  decoder )
+  cf2_getPpemY( PS_Decoder*  decoder )
   {
-    FT_ASSERT( decoder                          &&
-               decoder->builder.face            &&
-               decoder->builder.face->root.size );
+    FT_ASSERT( decoder                     &&
+               decoder->builder.face       &&
+               decoder->builder.face->size );
 
     /*
      * Note that `y_ppem' can be zero if there wasn't a call to
      *
      */
     return cf2_intToFixed(
-             decoder->builder.face->root.size->metrics.y_ppem );
+             decoder->builder.face->size->metrics.y_ppem );
   }
 
 
   /* FreeType stores these as integer font units       */
   /* (note: variable names seem swapped)               */
   FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getStdVW( CFF_Decoder*  decoder )
+  cf2_getStdVW( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
 
 
   FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getStdHW( CFF_Decoder*  decoder )
+  cf2_getStdHW( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
 
   /* note: FreeType stores 1000 times the actual value for `BlueScale' */
   FT_LOCAL_DEF( void )
-  cf2_getBlueMetrics( CFF_Decoder*  decoder,
-                      CF2_Fixed*    blueScale,
-                      CF2_Fixed*    blueShift,
-                      CF2_Fixed*    blueFuzz )
+  cf2_getBlueMetrics( PS_Decoder*  decoder,
+                      CF2_Fixed*   blueScale,
+                      CF2_Fixed*   blueShift,
+                      CF2_Fixed*   blueFuzz )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
   /* get blue values counts and arrays; the FreeType parser has validated */
   /* the counts and verified that each is an even number                  */
   FT_LOCAL_DEF( void )
-  cf2_getBlueValues( CFF_Decoder*  decoder,
-                     size_t*       count,
-                     FT_Pos*      *data )
+  cf2_getBlueValues( PS_Decoder*  decoder,
+                     size_t*      count,
+                     FT_Pos*     *data )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
 
 
   FT_LOCAL_DEF( void )
-  cf2_getOtherBlues( CFF_Decoder*  decoder,
-                     size_t*       count,
-                     FT_Pos*      *data )
+  cf2_getOtherBlues( PS_Decoder*  decoder,
+                     size_t*      count,
+                     FT_Pos*     *data )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
 
 
   FT_LOCAL_DEF( void )
-  cf2_getFamilyBlues( CFF_Decoder*  decoder,
-                      size_t*       count,
-                      FT_Pos*      *data )
+  cf2_getFamilyBlues( PS_Decoder*  decoder,
+                      size_t*      count,
+                      FT_Pos*     *data )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
 
 
   FT_LOCAL_DEF( void )
-  cf2_getFamilyOtherBlues( CFF_Decoder*  decoder,
-                           size_t*       count,
-                           FT_Pos*      *data )
+  cf2_getFamilyOtherBlues( PS_Decoder*  decoder,
+                           size_t*      count,
+                           FT_Pos*     *data )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
 
 
   FT_LOCAL_DEF( CF2_Int )
-  cf2_getLanguageGroup( CFF_Decoder*  decoder )
+  cf2_getLanguageGroup( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
   /* convert unbiased subroutine index to `CF2_Buffer' and */
   /* return 0 on success                                   */
   FT_LOCAL_DEF( CF2_Int )
-  cf2_initGlobalRegionBuffer( CFF_Decoder*  decoder,
-                              CF2_Int       subrNum,
-                              CF2_Buffer    buf )
+  cf2_initGlobalRegionBuffer( PS_Decoder*  decoder,
+                              CF2_Int      subrNum,
+                              CF2_Buffer   buf )
   {
     CF2_UInt  idx;
 
   /* convert AdobeStandardEncoding code to CF2_Buffer; */
   /* used for seac component                           */
   FT_LOCAL_DEF( FT_Error )
-  cf2_getSeacComponent( CFF_Decoder*  decoder,
-                        CF2_Int       code,
-                        CF2_Buffer    buf )
+  cf2_getSeacComponent( PS_Decoder*  decoder,
+                        CF2_Int      code,
+                        CF2_Buffer   buf )
   {
     CF2_Int   gid;
     FT_Byte*  charstring;
 
 
     FT_ASSERT( decoder );
+    FT_ASSERT( !decoder->builder.is_t1 );
 
     FT_ZERO( buf );
 
 #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 ( decoder->builder.face->root.internal->incremental_interface )
+    if ( decoder->builder.face->internal->incremental_interface )
       gid = code;
     else
 #endif /* FT_CONFIG_OPTION_INCREMENTAL */
         return FT_THROW( Invalid_Glyph_Format );
     }
 
-    error = cff_get_glyph_data( decoder->builder.face,
-                                (CF2_UInt)gid,
-                                &charstring,
-                                &len );
+    error = decoder->get_glyph_callback( (TT_Face)decoder->builder.face,
+                                         (CF2_UInt)gid,
+                                         &charstring,
+                                         &len );
     /* TODO: for now, just pass the FreeType error through */
     if ( error )
       return error;
 
 
   FT_LOCAL_DEF( void )
-  cf2_freeSeacComponent( CFF_Decoder*  decoder,
-                         CF2_Buffer    buf )
+  cf2_freeSeacComponent( PS_Decoder*  decoder,
+                         CF2_Buffer   buf )
+  {
+    FT_ASSERT( decoder );
+    FT_ASSERT( !decoder->builder.is_t1 );
+
+    decoder->free_glyph_callback( (TT_Face)decoder->builder.face,
+                                  (FT_Byte**)&buf->start,
+                                  (FT_ULong)( buf->end - buf->start ) );
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  cf2_getT1SeacComponent( PS_Decoder*  decoder,
+                          FT_UInt      glyph_index,
+                          CF2_Buffer   buf )
+  {
+    FT_Data   glyph_data;
+    FT_Error  error = FT_Err_Ok;
+    T1_Face   face  = (T1_Face)decoder->builder.face;
+    T1_Font   type1 = &face->type1;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    FT_Incremental_InterfaceRec  *inc =
+      face->root.internal->incremental_interface;
+
+
+    /* For incremental fonts get the character data using the */
+    /* callback function.                                     */
+    if ( inc )
+      error = inc->funcs->get_glyph_data( inc->object,
+                                          glyph_index, &glyph_data );
+    else
+#endif
+    /* For ordinary fonts get the character data stored in the face record. */
+    {
+      glyph_data.pointer = type1->charstrings[glyph_index];
+      glyph_data.length  = (FT_Int)type1->charstrings_len[glyph_index];
+    }
+
+    if ( !error )
+    {
+      FT_Byte*  charstring_base = (FT_Byte*)glyph_data.pointer;
+      FT_ULong  charstring_len  = (FT_ULong)glyph_data.length;
+
+
+      FT_ASSERT( charstring_base + charstring_len >= charstring_base );
+
+      FT_ZERO( buf );
+      buf->start =
+      buf->ptr   = charstring_base;
+      buf->end   = charstring_base + charstring_len;
+    }
+
+    return error;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_freeT1SeacComponent( PS_Decoder*  decoder,
+                           CF2_Buffer   buf )
   {
+    T1_Face  face;
+    FT_Data  data;
+
+
     FT_ASSERT( decoder );
 
-    cff_free_glyph_data( decoder->builder.face,
-                         (FT_Byte**)&buf->start,
-                         (FT_ULong)( buf->end - buf->start ) );
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+    face = (T1_Face)decoder->builder.face;
+
+    data.pointer = buf->start;
+    data.length  = (FT_Int)( buf->end - buf->start );
+
+    if ( face->root.internal->incremental_interface )
+      face->root.internal->incremental_interface->funcs->free_glyph_data(
+        face->root.internal->incremental_interface->object,
+        &data );
+#endif /* FT_CONFIG_OPTION_INCREMENTAL */
   }
 
 
   FT_LOCAL_DEF( CF2_Int )
-  cf2_initLocalRegionBuffer( CFF_Decoder*  decoder,
-                             CF2_Int       subrNum,
-                             CF2_Buffer    buf )
+  cf2_initLocalRegionBuffer( PS_Decoder*  decoder,
+                             CF2_Int      subrNum,
+                             CF2_Buffer   buf )
   {
     CF2_UInt  idx;
 
 
     FT_ASSERT( decoder->locals );
 
-    buf->start =
-    buf->ptr   = decoder->locals[idx];
-    buf->end   = decoder->locals[idx + 1];
+    buf->start = decoder->locals[idx];
+
+    if ( decoder->builder.is_t1 )
+    {
+      /* 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.          */
+      if ( decoder->locals_len )
+        buf->end = buf->start + decoder->locals_len[idx];
+      else
+      {
+        /* We are using subroutines from a CID font.  We must adjust */
+        /* for the seed bytes.                                       */
+        buf->start += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );
+        buf->end    = decoder->locals[idx + 1];
+      }
+
+      if ( !buf->start )
+      {
+        FT_ERROR(( "cf2_initLocalRegionBuffer (Type 1 mode):"
+                   " invoking empty subrs\n" ));
+      }
+    }
+    else
+    {
+      buf->end = decoder->locals[idx + 1];
+    }
+
+    buf->ptr = buf->start;
 
     return FALSE;      /* success */
   }
 
 
   FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getDefaultWidthX( CFF_Decoder*  decoder )
+  cf2_getDefaultWidthX( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
 
 
   FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getNominalWidthX( CFF_Decoder*  decoder )
+  cf2_getNominalWidthX( PS_Decoder*  decoder )
   {
     FT_ASSERT( decoder && decoder->current_subfont );
 
   FT_LOCAL_DEF( void )
   cf2_outline_reset( CF2_Outline  outline )
   {
-    CFF_Decoder*  decoder = outline->decoder;
+    PS_Decoder*  decoder = outline->decoder;
 
 
     FT_ASSERT( decoder );
   FT_LOCAL_DEF( void )
   cf2_outline_close( CF2_Outline  outline )
   {
-    CFF_Decoder*  decoder = outline->decoder;
+    PS_Decoder*  decoder = outline->decoder;
 
 
     FT_ASSERT( decoder );
 
-    cff_builder_close_contour( &decoder->builder );
+    ps_builder_close_contour( &decoder->builder );
 
     FT_GlyphLoader_Add( decoder->builder.loader );
   }
similarity index 60%
rename from src/cff/cf2ft.h
rename to src/psaux/psft.h
index b054a6e..ab17211 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2ft.h                                                                */
+/*  psft.h                                                                 */
 /*                                                                         */
 /*    FreeType Glue Component to Adobe's Interpreter (specification).      */
 /*                                                                         */
 /***************************************************************************/
 
 
-#ifndef CF2FT_H_
-#define CF2FT_H_
+#ifndef PSFT_H_
+#define PSFT_H_
 
 
-#include "cf2types.h"
+#include "pstypes.h"
 
 
   /* TODO: disable asserts for now */
 
 #include FT_SYSTEM_H
 
-#include "cf2glue.h"
-#include "cffgload.h"    /* for CFF_Decoder */
+#include "psglue.h"
+#include FT_INTERNAL_POSTSCRIPT_AUX_H    /* for PS_Decoder */
 
 
 FT_BEGIN_HEADER
 
 
   FT_LOCAL( FT_Error )
-  cf2_decoder_parse_charstrings( CFF_Decoder*  decoder,
-                                 FT_Byte*      charstring_base,
-                                 FT_ULong      charstring_len );
+  cf2_decoder_parse_charstrings( PS_Decoder*  decoder,
+                                 FT_Byte*     charstring_base,
+                                 FT_ULong     charstring_len );
 
   FT_LOCAL( CFF_SubFont )
-  cf2_getSubfont( CFF_Decoder*  decoder );
+  cf2_getSubfont( PS_Decoder*  decoder );
 
   FT_LOCAL( CFF_VStore )
-  cf2_getVStore( CFF_Decoder*  decoder );
+  cf2_getVStore( PS_Decoder*  decoder );
 
   FT_LOCAL( FT_UInt )
-  cf2_getMaxstack( CFF_Decoder*  decoder );
+  cf2_getMaxstack( PS_Decoder*  decoder );
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
   FT_LOCAL( FT_Error )
-  cf2_getNormalizedVector( CFF_Decoder*  decoder,
-                           CF2_UInt     *len,
-                           FT_Fixed*    *vec );
+  cf2_getNormalizedVector( PS_Decoder*  decoder,
+                           CF2_UInt    *len,
+                           FT_Fixed*   *vec );
 #endif
 
   FT_LOCAL( CF2_Fixed )
-  cf2_getPpemY( CFF_Decoder*  decoder );
+  cf2_getPpemY( PS_Decoder*  decoder );
   FT_LOCAL( CF2_Fixed )
-  cf2_getStdVW( CFF_Decoder*  decoder );
+  cf2_getStdVW( PS_Decoder*  decoder );
   FT_LOCAL( CF2_Fixed )
-  cf2_getStdHW( CFF_Decoder*  decoder );
+  cf2_getStdHW( PS_Decoder*  decoder );
 
   FT_LOCAL( void )
-  cf2_getBlueMetrics( CFF_Decoder*  decoder,
-                      CF2_Fixed*    blueScale,
-                      CF2_Fixed*    blueShift,
-                      CF2_Fixed*    blueFuzz );
+  cf2_getBlueMetrics( PS_Decoder*  decoder,
+                      CF2_Fixed*   blueScale,
+                      CF2_Fixed*   blueShift,
+                      CF2_Fixed*   blueFuzz );
   FT_LOCAL( void )
-  cf2_getBlueValues( CFF_Decoder*  decoder,
-                     size_t*       count,
-                     FT_Pos*      *data );
+  cf2_getBlueValues( PS_Decoder*  decoder,
+                     size_t*      count,
+                     FT_Pos*     *data );
   FT_LOCAL( void )
-  cf2_getOtherBlues( CFF_Decoder*  decoder,
-                     size_t*       count,
-                     FT_Pos*      *data );
+  cf2_getOtherBlues( PS_Decoder*  decoder,
+                     size_t*      count,
+                     FT_Pos*     *data );
   FT_LOCAL( void )
-  cf2_getFamilyBlues( CFF_Decoder*  decoder,
-                      size_t*       count,
-                      FT_Pos*      *data );
+  cf2_getFamilyBlues( PS_Decoder*  decoder,
+                      size_t*      count,
+                      FT_Pos*     *data );
   FT_LOCAL( void )
-  cf2_getFamilyOtherBlues( CFF_Decoder*  decoder,
-                           size_t*       count,
-                           FT_Pos*      *data );
+  cf2_getFamilyOtherBlues( PS_Decoder*  decoder,
+                           size_t*      count,
+                           FT_Pos*     *data );
 
   FT_LOCAL( CF2_Int )
-  cf2_getLanguageGroup( CFF_Decoder*  decoder );
+  cf2_getLanguageGroup( PS_Decoder*  decoder );
 
   FT_LOCAL( CF2_Int )
-  cf2_initGlobalRegionBuffer( CFF_Decoder*  decoder,
-                              CF2_Int       subrNum,
-                              CF2_Buffer    buf );
+  cf2_initGlobalRegionBuffer( PS_Decoder*  decoder,
+                              CF2_Int      subrNum,
+                              CF2_Buffer   buf );
   FT_LOCAL( FT_Error )
-  cf2_getSeacComponent( CFF_Decoder*  decoder,
-                        CF2_Int       code,
-                        CF2_Buffer    buf );
+  cf2_getSeacComponent( PS_Decoder*  decoder,
+                        CF2_Int      code,
+                        CF2_Buffer   buf );
   FT_LOCAL( void )
-  cf2_freeSeacComponent( CFF_Decoder*  decoder,
-                         CF2_Buffer    buf );
+  cf2_freeSeacComponent( PS_Decoder*  decoder,
+                         CF2_Buffer   buf );
   FT_LOCAL( CF2_Int )
-  cf2_initLocalRegionBuffer( CFF_Decoder*  decoder,
-                             CF2_Int       subrNum,
-                             CF2_Buffer    buf );
+  cf2_initLocalRegionBuffer( PS_Decoder*  decoder,
+                             CF2_Int      subrNum,
+                             CF2_Buffer   buf );
 
   FT_LOCAL( CF2_Fixed )
-  cf2_getDefaultWidthX( CFF_Decoder*  decoder );
+  cf2_getDefaultWidthX( PS_Decoder*  decoder );
   FT_LOCAL( CF2_Fixed )
-  cf2_getNominalWidthX( CFF_Decoder*  decoder );
+  cf2_getNominalWidthX( PS_Decoder*  decoder );
 
 
+  FT_LOCAL( FT_Error )
+  cf2_getT1SeacComponent( PS_Decoder*  decoder,
+                          FT_UInt      glyph_index,
+                          CF2_Buffer   buf );
+  FT_LOCAL( void )
+  cf2_freeT1SeacComponent( PS_Decoder*  decoder,
+                           CF2_Buffer   buf );
+
   /*
    * FreeType client outline
    *
@@ -139,7 +147,7 @@ FT_BEGIN_HEADER
   typedef struct  CF2_OutlineRec_
   {
     CF2_OutlineCallbacksRec  root;        /* base class must be first */
-    CFF_Decoder*             decoder;
+    PS_Decoder*              decoder;
 
   } CF2_OutlineRec, *CF2_Outline;
 
@@ -153,7 +161,7 @@ FT_BEGIN_HEADER
 FT_END_HEADER
 
 
-#endif /* CF2FT_H_ */
+#endif /* PSFT_H_ */
 
 
 /* END */
similarity index 96%
rename from src/cff/cf2glue.h
rename to src/psaux/psglue.h
index 56a7c24..5545e12 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2glue.h                                                              */
+/*  psglue.h                                                               */
 /*                                                                         */
 /*    Adobe's code for shared stuff (specification only).                  */
 /*                                                                         */
 /***************************************************************************/
 
 
-#ifndef CF2GLUE_H_
-#define CF2GLUE_H_
+#ifndef PSGLUE_H_
+#define PSGLUE_H_
 
 
 /* common includes for other modules */
-#include "cf2error.h"
-#include "cf2fixed.h"
-#include "cf2arrst.h"
-#include "cf2read.h"
+#include "pserror.h"
+#include "psfixed.h"
+#include "psarrst.h"
+#include "psread.h"
 
 
 FT_BEGIN_HEADER
@@ -138,7 +138,7 @@ FT_BEGIN_HEADER
 FT_END_HEADER
 
 
-#endif /* CF2GLUE_H_ */
+#endif /* PSGLUE_H_ */
 
 
 /* END */
similarity index 86%
rename from src/cff/cf2hints.c
rename to src/psaux/pshints.c
index c8f7dfe..3615196 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2hints.c                                                             */
+/*  pshints.c                                                              */
 /*                                                                         */
 /*    Adobe's code for handling CFF hints (body).                          */
 /*                                                                         */
 /***************************************************************************/
 
 
-#include "cf2ft.h"
+#include "psft.h"
 #include FT_INTERNAL_DEBUG_H
 
-#include "cf2glue.h"
-#include "cf2font.h"
-#include "cf2hints.h"
-#include "cf2intrp.h"
+#include "psglue.h"
+#include "psfont.h"
+#include "pshints.h"
+#include "psintrp.h"
 
 
   /*************************************************************************/
@@ -74,8 +74,8 @@
     /* cross product of pt1 position from origin with pt2 position from  */
     /* pt1; we reduce the precision so that the result fits into 32 bits */
 
-    return ( x1 >> 16 ) * ( ( y2 - y1 ) >> 16 ) -
-           ( y1 >> 16 ) * ( ( x2 - x1 ) >> 16 );
+    return ( x1 >> 16 ) * ( SUB_INT32( y2, y1 ) >> 16 ) -
+           ( y1 >> 16 ) * ( SUB_INT32( x2, x1 ) >> 16 );
   }
 
 
                                          stemHintArray,
                                          indexStemHint );
 
-    width = stemHint->max - stemHint->min;
+    width = SUB_INT32( stemHint->max, stemHint->min );
 
     if ( width == cf2_intToFixed( -21 ) )
     {
     /* darkening.  Bottoms are not changed; tops are incremented by twice */
     /* `darkenY'.                                                         */
     if ( cf2_hint_isTop( hint ) )
-      hint->csCoord += 2 * font->darkenY;
+      hint->csCoord = ADD_INT32( hint->csCoord, 2 * font->darkenY );
 
-    hint->csCoord += hintOrigin;
-    hint->scale    = scale;
-    hint->index    = indexStemHint;   /* index in original stem hint array */
+    hint->csCoord = ADD_INT32( hint->csCoord, hintOrigin );
+    hint->scale   = scale;
+    hint->index   = indexStemHint;   /* index in original stem hint array */
 
     /* if original stem hint has been used, use the same position */
     if ( hint->flags != 0 && stemHint->used )
   }
 
 
+  static void
+  cf2_hintmap_dump( CF2_HintMap  hintmap )
+  {
+#ifdef FT_DEBUG_LEVEL_TRACE
+    CF2_UInt  i;
+
+
+    FT_TRACE6(( "  index  csCoord  dsCoord  scale  flags\n" ));
+
+    for ( i = 0; i < hintmap->count; i++ )
+    {
+      CF2_Hint  hint = &hintmap->edge[i];
+
+
+      FT_TRACE6(( "  %3d    %7.2f  %7.2f  %5d  %s%s%s%s\n",
+                  hint->index,
+                  hint->csCoord / 65536.0,
+                  hint->dsCoord / ( hint->scale * 1.0 ),
+                  hint->scale,
+                  ( cf2_hint_isPair( hint ) ? "p" : "g" ),
+                  ( cf2_hint_isTop( hint ) ? "t" : "b" ),
+                  ( cf2_hint_isLocked( hint ) ? "L" : ""),
+                  ( cf2_hint_isSynthetic( hint ) ? "S" : "" ) ));
+    }
+#else
+    FT_UNUSED( hintmap );
+#endif
+  }
+
+
   /* transform character space coordinate to device space using hint map */
   static CF2_Fixed
   cf2_hintmap_map( CF2_HintMap  hintmap,
       /* start linear search from last hit */
       CF2_UInt  i = hintmap->lastIndex;
 
+
       FT_ASSERT( hintmap->lastIndex < CF2_MAX_HINT_EDGES );
 
       /* search up */
       if ( i == 0 && csCoord < hintmap->edge[0].csCoord )
       {
         /* special case for points below first edge: use uniform scale */
-        return FT_MulFix( csCoord - hintmap->edge[0].csCoord,
-                          hintmap->scale ) +
-                 hintmap->edge[0].dsCoord;
+        return ADD_INT32( FT_MulFix( SUB_INT32( csCoord,
+                                                hintmap->edge[0].csCoord ),
+                                     hintmap->scale ),
+                          hintmap->edge[0].dsCoord );
       }
       else
       {
          * Note: entries with duplicate csCoord are allowed.
          * Use edge[i], the highest entry where csCoord >= entry[i].csCoord
          */
-        return FT_MulFix( csCoord - hintmap->edge[i].csCoord,
-                          hintmap->edge[i].scale ) +
-                 hintmap->edge[i].dsCoord;
+        return ADD_INT32( FT_MulFix( SUB_INT32( csCoord,
+                                                hintmap->edge[i].csCoord ),
+                                     hintmap->edge[i].scale ),
+                          hintmap->edge[i].dsCoord );
       }
     }
   }
         /* is there room to move up?                                    */
         /* there is if we are at top of array or the next edge is at or */
         /* beyond proposed move up?                                     */
-        if ( j >= hintmap->count - 1                            ||
+        if ( j >= hintmap->count - 1                ||
              hintmap->edge[j + 1].dsCoord >=
-               hintmap->edge[j].dsCoord + moveUp + upMinCounter )
+               ADD_INT32( hintmap->edge[j].dsCoord,
+                          moveUp + upMinCounter )   )
         {
           /* there is room to move up; is there also room to move down? */
-          if ( i == 0                                                 ||
+          if ( i == 0                                   ||
                hintmap->edge[i - 1].dsCoord <=
-                 hintmap->edge[i].dsCoord + moveDown - downMinCounter )
+                 ADD_INT32( hintmap->edge[i].dsCoord,
+                            moveDown - downMinCounter ) )
           {
             /* move smaller absolute amount */
             move = ( -moveDown < moveUp ) ? moveDown : moveUp;  /* optimum */
         else
         {
           /* is there room to move down? */
-          if ( i == 0                                                 ||
+          if ( i == 0                                   ||
                hintmap->edge[i - 1].dsCoord <=
-                 hintmap->edge[i].dsCoord + moveDown - downMinCounter )
+                 ADD_INT32( hintmap->edge[i].dsCoord,
+                            moveDown - downMinCounter ) )
           {
             move     = moveDown;
             /* true if non-optimum move */
         }
 
         /* move the edge(s) */
-        hintmap->edge[i].dsCoord += move;
+        hintmap->edge[i].dsCoord = ADD_INT32( hintmap->edge[i].dsCoord,
+                                              move );
         if ( isPair )
-          hintmap->edge[j].dsCoord += move;
+          hintmap->edge[j].dsCoord = ADD_INT32( hintmap->edge[j].dsCoord,
+                                                move );
       }
 
       /* assert there are no overlaps in device space */
       {
         if ( hintmap->edge[i].csCoord != hintmap->edge[i - 1].csCoord )
           hintmap->edge[i - 1].scale =
-            FT_DivFix(
-              hintmap->edge[i].dsCoord - hintmap->edge[i - 1].dsCoord,
-              hintmap->edge[i].csCoord - hintmap->edge[i - 1].csCoord );
+            FT_DivFix( SUB_INT32( hintmap->edge[i].dsCoord,
+                                  hintmap->edge[i - 1].dsCoord ),
+                       SUB_INT32( hintmap->edge[i].csCoord,
+                                  hintmap->edge[i - 1].csCoord ) );
       }
 
       if ( isPair )
       {
         if ( hintmap->edge[j].csCoord != hintmap->edge[j - 1].csCoord )
           hintmap->edge[j - 1].scale =
-            FT_DivFix(
-              hintmap->edge[j].dsCoord - hintmap->edge[j - 1].dsCoord,
-              hintmap->edge[j].csCoord - hintmap->edge[j - 1].csCoord );
+            FT_DivFix( SUB_INT32( hintmap->edge[j].dsCoord,
+                                  hintmap->edge[j - 1].dsCoord ),
+                       SUB_INT32( hintmap->edge[j].csCoord,
+                                  hintmap->edge[j - 1].csCoord ) );
 
         i += 1;     /* skip upper edge on next loop */
       }
 
       /* is there room to move up? */
       if ( hintmap->edge[j + 1].dsCoord >=
-             hintmap->edge[j].dsCoord + hintMove->moveUp + CF2_MIN_COUNTER )
+             ADD_INT32( hintmap->edge[j].dsCoord,
+                        hintMove->moveUp + CF2_MIN_COUNTER ) )
       {
         /* there is more room now, move edge up */
-        hintmap->edge[j].dsCoord += hintMove->moveUp;
+        hintmap->edge[j].dsCoord = ADD_INT32( hintmap->edge[j].dsCoord,
+                                              hintMove->moveUp );
 
         if ( cf2_hint_isPair( &hintmap->edge[j] ) )
         {
           FT_ASSERT( j > 0 );
-          hintmap->edge[j - 1].dsCoord += hintMove->moveUp;
+          hintmap->edge[j - 1].dsCoord =
+            ADD_INT32( hintmap->edge[j - 1].dsCoord, hintMove->moveUp );
         }
       }
     }
         break;
     }
 
+    FT_TRACE7(( "  Got hint at %.2f (%.2f)\n",
+                firstHintEdge->csCoord / 65536.0,
+                firstHintEdge->dsCoord / 65536.0 ));
+    if ( isPair )
+      FT_TRACE7(( "  Got hint at %.2f (%.2f)\n",
+                  secondHintEdge->csCoord / 65536.0,
+                  secondHintEdge->dsCoord / 65536.0 ));
+
     /*
      * Discard any hints that overlap in character space.  Most often, this
      * is while building the initial map, where captured hints from all
       {
         /* Use hint map to position the center of stem, and nominal scale */
         /* to position the two edges.  This preserves the stem width.     */
-        CF2_Fixed  midpoint  = cf2_hintmap_map(
-                                 hintmap->initialHintMap,
-                                 ( secondHintEdge->csCoord +
-                                   firstHintEdge->csCoord ) / 2 );
-        CF2_Fixed  halfWidth = FT_MulFix(
-                                 ( secondHintEdge->csCoord -
-                                   firstHintEdge->csCoord ) / 2,
-                                 hintmap->scale );
-
-
-        firstHintEdge->dsCoord  = midpoint - halfWidth;
-        secondHintEdge->dsCoord = midpoint + halfWidth;
+        CF2_Fixed  midpoint =
+                     cf2_hintmap_map(
+                       hintmap->initialHintMap,
+                       ADD_INT32( secondHintEdge->csCoord,
+                                  firstHintEdge->csCoord ) / 2 );
+        CF2_Fixed  halfWidth =
+                     FT_MulFix( SUB_INT32( secondHintEdge->csCoord,
+                                           firstHintEdge->csCoord ) / 2,
+                                hintmap->scale );
+
+
+        firstHintEdge->dsCoord  = SUB_INT32( midpoint, halfWidth );
+        secondHintEdge->dsCoord = ADD_INT32( midpoint, halfWidth );
       }
       else
         firstHintEdge->dsCoord = cf2_hintmap_map( hintmap->initialHintMap,
 
       /* insert first edge */
       hintmap->edge[indexInsert] = *firstHintEdge;         /* copy struct */
-      hintmap->count += 1;
+      hintmap->count            += 1;
+
+      FT_TRACE7(( "  Inserting hint %.2f (%.2f)\n",
+                  firstHintEdge->csCoord / 65536.0,
+                  firstHintEdge->dsCoord / 65536.0 ));
 
       if ( isPair )
       {
         /* insert second edge */
         hintmap->edge[indexInsert + 1] = *secondHintEdge;  /* copy struct */
         hintmap->count                += 1;
+
+        FT_TRACE7(( "  Inserting hint %.2f (%.2f)\n",
+                    secondHintEdge->csCoord / 65536.0,
+                    secondHintEdge->dsCoord / 65536.0 ));
+
       }
     }
 
                            cf2_arrstack_size( hStemHintArray ) +
                              cf2_arrstack_size( vStemHintArray ) );
       if ( !cf2_hintmask_isValid( hintMask ) )
-          return;                   /* too many stem hints */
+      {
+        if ( font->isT1 )
+        {
+          /* no error, just continue unhinted */
+          *hintMask->error = FT_Err_Ok;
+          hintmap->hinted  = FALSE;
+        }
+        return;                   /* too many stem hints */
+      }
     }
 
     /* begin by clearing the map */
 
     /* Defense-in-depth.  Should never return here. */
     if ( bitCount > hintMask->bitCount )
-        return;
+      return;
 
     /* synthetic embox hints get highest priority */
     if ( font->blues.doEmBoxHints )
       }
     }
 
+    FT_TRACE6(( initialMap ? "flags: [p]air [g]host [t]op "
+                             "[b]ottom [L]ocked [S]ynthetic\n"
+                             "Initial hintmap\n"
+                           : "Hints:\n" ));
+    cf2_hintmap_dump( hintmap );
+
     /*
      * Note: The following line is a convenient place to break when
      *       debugging hinting.  Examine `hintmap->edge' for the list of
     /* adjust positions of hint edges that are not locked to blue zones */
     cf2_hintmap_adjustHints( hintmap );
 
+    FT_TRACE6(( "(adjusted)\n" ));
+    cf2_hintmap_dump( hintmap );
+
     /* save the position of all hints that were used in this hint map; */
     /* if we use them again, we'll locate them in the same position    */
     if ( !initialMap )
                                      cf2_fixedAbs( glyphpath->yOffset ) );
 
     /* .1 character space unit */
-    glyphpath->snapThreshold = cf2_floatToFixed( 0.1f );
+    glyphpath->snapThreshold = cf2_doubleToFixed( 0.1 );
 
     glyphpath->moveIsPending = TRUE;
     glyphpath->pathIsOpen    = FALSE;
     FT_Vector  pt;   /* hinted point in upright DS */
 
 
-    pt.x = FT_MulFix( glyphpath->scaleX, x ) +
-             FT_MulFix( glyphpath->scaleC, y );
+    pt.x = ADD_INT32( FT_MulFix( glyphpath->scaleX, x ),
+                      FT_MulFix( glyphpath->scaleC, y ) );
     pt.y = cf2_hintmap_map( hintmap, y );
 
-    ppt->x = FT_MulFix( glyphpath->font->outerTransform.a, pt.x )   +
-               FT_MulFix( glyphpath->font->outerTransform.c, pt.y ) +
-               glyphpath->fractionalTranslation.x;
-    ppt->y = FT_MulFix( glyphpath->font->outerTransform.b, pt.x )   +
-               FT_MulFix( glyphpath->font->outerTransform.d, pt.y ) +
-               glyphpath->fractionalTranslation.y;
+    ppt->x = ADD_INT32(
+               FT_MulFix( glyphpath->font->outerTransform.a, pt.x ),
+               ADD_INT32(
+                 FT_MulFix( glyphpath->font->outerTransform.c, pt.y ),
+                 glyphpath->fractionalTranslation.x ) );
+    ppt->y = ADD_INT32(
+               FT_MulFix( glyphpath->font->outerTransform.b, pt.x ),
+               ADD_INT32(
+                 FT_MulFix( glyphpath->font->outerTransform.d, pt.y ),
+                 glyphpath->fractionalTranslation.y ) );
   }
 
 
      * second segment.
      * Let `w 'be the zero-based vector from `u1' to `v1'.
      * `perp' is the `perpendicular dot product'; see
-     * http://mathworld.wolfram.com/PerpDotProduct.html.
+     * https://mathworld.wolfram.com/PerpDotProduct.html.
      * `s' is the parameter for the parametric line for the first segment
      * (`u').
      *
     CF2_Fixed  denominator, s;
 
 
-    u.x = CF2_CS_SCALE( u2->x - u1->x );
-    u.y = CF2_CS_SCALE( u2->y - u1->y );
-    v.x = CF2_CS_SCALE( v2->x - v1->x );
-    v.y = CF2_CS_SCALE( v2->y - v1->y );
-    w.x = CF2_CS_SCALE( v1->x - u1->x );
-    w.y = CF2_CS_SCALE( v1->y - u1->y );
+    u.x = CF2_CS_SCALE( SUB_INT32( u2->x, u1->x ) );
+    u.y = CF2_CS_SCALE( SUB_INT32( u2->y, u1->y ) );
+    v.x = CF2_CS_SCALE( SUB_INT32( v2->x, v1->x ) );
+    v.y = CF2_CS_SCALE( SUB_INT32( v2->y, v1->y ) );
+    w.x = CF2_CS_SCALE( SUB_INT32( v1->x, u1->x ) );
+    w.y = CF2_CS_SCALE( SUB_INT32( v1->y, u1->y ) );
 
     denominator = cf2_perp( u, v );
 
 
     s = FT_DivFix( cf2_perp( w, v ), denominator );
 
-    intersection->x = u1->x + FT_MulFix( s, u2->x - u1->x );
-    intersection->y = u1->y + FT_MulFix( s, u2->y - u1->y );
+    intersection->x = ADD_INT32( u1->x,
+                                 FT_MulFix( s, SUB_INT32( u2->x, u1->x ) ) );
+    intersection->y = ADD_INT32( u1->y,
+                                 FT_MulFix( s, SUB_INT32( u2->y, u1->y ) ) );
+
 
     /*
      * Special case snapping for horizontal and vertical lines.
      *
      */
 
-    if ( u1->x == u2->x                                                     &&
-         cf2_fixedAbs( intersection->x - u1->x ) < glyphpath->snapThreshold )
+    if ( u1->x == u2->x                                                &&
+         cf2_fixedAbs( SUB_INT32( intersection->x,
+                                  u1->x ) ) < glyphpath->snapThreshold )
       intersection->x = u1->x;
-    if ( u1->y == u2->y                                                     &&
-         cf2_fixedAbs( intersection->y - u1->y ) < glyphpath->snapThreshold )
+    if ( u1->y == u2->y                                                &&
+         cf2_fixedAbs( SUB_INT32( intersection->y,
+                                  u1->y ) ) < glyphpath->snapThreshold )
       intersection->y = u1->y;
 
-    if ( v1->x == v2->x                                                     &&
-         cf2_fixedAbs( intersection->x - v1->x ) < glyphpath->snapThreshold )
+    if ( v1->x == v2->x                                                &&
+         cf2_fixedAbs( SUB_INT32( intersection->x,
+                                  v1->x ) ) < glyphpath->snapThreshold )
       intersection->x = v1->x;
-    if ( v1->y == v2->y                                                     &&
-         cf2_fixedAbs( intersection->y - v1->y ) < glyphpath->snapThreshold )
+    if ( v1->y == v2->y                                                &&
+         cf2_fixedAbs( SUB_INT32( intersection->y,
+                                  v1->y ) ) < glyphpath->snapThreshold )
       intersection->y = v1->y;
 
     /* limit the intersection distance from midpoint of u2 and v1 */
-    if ( cf2_fixedAbs( intersection->x - ( u2->x + v1->x ) / 2 ) >
-           glyphpath->miterLimit                                   ||
-         cf2_fixedAbs( intersection->y - ( u2->y + v1->y ) / 2 ) >
-           glyphpath->miterLimit                                   )
+    if ( cf2_fixedAbs( intersection->x - ADD_INT32( u2->x, v1->x ) / 2 ) >
+           glyphpath->miterLimit                                           ||
+         cf2_fixedAbs( intersection->y - ADD_INT32( u2->y, v1->y ) / 2 ) >
+           glyphpath->miterLimit                                           )
       return FALSE;
 
     return TRUE;
                                CF2_Fixed*     x,
                                CF2_Fixed*     y )
   {
-    CF2_Fixed  dx = x2 - x1;
-    CF2_Fixed  dy = y2 - y1;
+    CF2_Fixed  dx = SUB_INT32( x2, x1 );
+    CF2_Fixed  dy = SUB_INT32( y2, y1 );
 
 
     /* note: negative offsets don't work here; negate deltas to change */
     /* quadrants, below                                                */
     if ( glyphpath->font->reverseWinding )
     {
-      dx = -dx;
-      dy = -dy;
+      dx = NEG_INT32( dx );
+      dy = NEG_INT32( dy );
     }
 
     *x = *y = 0;
         return;
 
     /* add momentum for this path element */
-    glyphpath->callbacks->windingMomentum +=
-      cf2_getWindingMomentum( x1, y1, x2, y2 );
+    glyphpath->callbacks->windingMomentum =
+      ADD_INT32( glyphpath->callbacks->windingMomentum,
+                 cf2_getWindingMomentum( x1, y1, x2, y2 ) );
 
     /* note: allow mixed integer and fixed multiplication here */
     if ( dx >= 0 )
       {
         /* first quadrant, +x +y */
 
-        if ( dx > 2 * dy )
+        if ( dx > MUL_INT32( 2, dy ) )
         {
           /* +x */
           *x = 0;
           *y = 0;
         }
-        else if ( dy > 2 * dx )
+        else if ( dy > MUL_INT32( 2, dx ) )
         {
           /* +y */
           *x = glyphpath->xOffset;
         else
         {
           /* +x +y */
-          *x = FT_MulFix( cf2_floatToFixed( 0.7 ),
+          *x = FT_MulFix( cf2_doubleToFixed( 0.7 ),
                           glyphpath->xOffset );
-          *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),
+          *y = FT_MulFix( cf2_doubleToFixed( 1.0 - 0.7 ),
                           glyphpath->yOffset );
         }
       }
       {
         /* fourth quadrant, +x -y */
 
-        if ( dx > -2 * dy )
+        if ( dx > MUL_INT32( -2, dy ) )
         {
           /* +x */
           *x = 0;
           *y = 0;
         }
-        else if ( -dy > 2 * dx )
+        else if ( NEG_INT32( dy ) > MUL_INT32( 2, dx ) )
         {
           /* -y */
-          *x = -glyphpath->xOffset;
+          *x = NEG_INT32( glyphpath->xOffset );
           *y = glyphpath->yOffset;
         }
         else
         {
           /* +x -y */
-          *x = FT_MulFix( cf2_floatToFixed( -0.7 ),
+          *x = FT_MulFix( cf2_doubleToFixed( -0.7 ),
                           glyphpath->xOffset );
-          *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),
+          *y = FT_MulFix( cf2_doubleToFixed( 1.0 - 0.7 ),
                           glyphpath->yOffset );
         }
       }
       {
         /* second quadrant, -x +y */
 
-        if ( -dx > 2 * dy )
+        if ( NEG_INT32( dx ) > MUL_INT32( 2, dy ) )
         {
           /* -x */
           *x = 0;
-          *y = 2 * glyphpath->yOffset;
+          *y = MUL_INT32( 2, glyphpath->yOffset );
         }
-        else if ( dy > -2 * dx )
+        else if ( dy > MUL_INT32( -2, dx ) )
         {
           /* +y */
           *x = glyphpath->xOffset;
         else
         {
           /* -x +y */
-          *x = FT_MulFix( cf2_floatToFixed( 0.7 ),
+          *x = FT_MulFix( cf2_doubleToFixed( 0.7 ),
                           glyphpath->xOffset );
-          *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),
+          *y = FT_MulFix( cf2_doubleToFixed( 1.0 + 0.7 ),
                           glyphpath->yOffset );
         }
       }
       {
         /* third quadrant, -x -y */
 
-        if ( -dx > -2 * dy )
+        if ( NEG_INT32( dx ) > MUL_INT32( -2, dy ) )
         {
           /* -x */
           *x = 0;
-          *y = 2 * glyphpath->yOffset;
+          *y = MUL_INT32( 2, glyphpath->yOffset );
         }
-        else if ( -dy > -2 * dx )
+        else if ( NEG_INT32( dy ) > MUL_INT32( -2, dx ) )
         {
           /* -y */
-          *x = -glyphpath->xOffset;
+          *x = NEG_INT32( glyphpath->xOffset );
           *y = glyphpath->yOffset;
         }
         else
         {
           /* -x -y */
-          *x = FT_MulFix( cf2_floatToFixed( -0.7 ),
+          *x = FT_MulFix( cf2_doubleToFixed( -0.7 ),
                           glyphpath->xOffset );
-          *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),
+          *y = FT_MulFix( cf2_doubleToFixed( 1.0 + 0.7 ),
                           glyphpath->yOffset );
         }
       }
                                  &yOffset );
 
     /* construct offset points */
-    P0.x = glyphpath->currentCS.x + xOffset;
-    P0.y = glyphpath->currentCS.y + yOffset;
-    P1.x = x + xOffset;
-    P1.y = y + yOffset;
+    P0.x = ADD_INT32( glyphpath->currentCS.x, xOffset );
+    P0.y = ADD_INT32( glyphpath->currentCS.y, yOffset );
+    P1.x = ADD_INT32( x, xOffset );
+    P1.y = ADD_INT32( y, yOffset );
 
     if ( glyphpath->moveIsPending )
     {
                                  &yOffset3 );
 
     /* add momentum from the middle segment */
-    glyphpath->callbacks->windingMomentum +=
-      cf2_getWindingMomentum( x1, y1, x2, y2 );
+    glyphpath->callbacks->windingMomentum =
+      ADD_INT32( glyphpath->callbacks->windingMomentum,
+                 cf2_getWindingMomentum( x1, y1, x2, y2 ) );
 
     /* construct offset points */
-    P0.x = glyphpath->currentCS.x + xOffset1;
-    P0.y = glyphpath->currentCS.y + yOffset1;
-    P1.x = x1 + xOffset1;
-    P1.y = y1 + yOffset1;
+    P0.x = ADD_INT32( glyphpath->currentCS.x, xOffset1 );
+    P0.y = ADD_INT32( glyphpath->currentCS.y, yOffset1 );
+    P1.x = ADD_INT32( x1, xOffset1 );
+    P1.y = ADD_INT32( y1, yOffset1 );
     /* note: preserve angle of final segment by using offset3 at both ends */
-    P2.x = x2 + xOffset3;
-    P2.y = y2 + yOffset3;
-    P3.x = x3 + xOffset3;
-    P3.y = y3 + yOffset3;
+    P2.x = ADD_INT32( x2, xOffset3 );
+    P2.y = ADD_INT32( y2, yOffset3 );
+    P3.x = ADD_INT32( x3, xOffset3 );
+    P3.y = ADD_INT32( y3, yOffset3 );
 
     if ( glyphpath->moveIsPending )
     {
similarity index 98%
rename from src/cff/cf2hints.h
rename to src/psaux/pshints.h
index a898454..92e37e9 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2hints.h                                                             */
+/*  pshints.h                                                              */
 /*                                                                         */
 /*    Adobe's code for handling CFF hints (body).                          */
 /*                                                                         */
@@ -36,9 +36,8 @@
 /***************************************************************************/
 
 
-#ifndef CF2HINTS_H_
-#define CF2HINTS_H_
-
+#ifndef PSHINT_H_
+#define PSHINT_H_
 
 FT_BEGIN_HEADER
 
@@ -283,7 +282,7 @@ FT_BEGIN_HEADER
 FT_END_HEADER
 
 
-#endif /* CF2HINTS_H_ */
+#endif /* PSHINT_H_ */
 
 
 /* END */
diff --git a/src/psaux/psintrp.c b/src/psaux/psintrp.c
new file mode 100644 (file)
index 0000000..5c0ee78
--- /dev/null
@@ -0,0 +1,3038 @@
+/***************************************************************************/
+/*                                                                         */
+/*  psintrp.c                                                              */
+/*                                                                         */
+/*    Adobe's CFF Interpreter (body).                                      */
+/*                                                                         */
+/*  Copyright 2007-2014 Adobe Systems Incorporated.                        */
+/*                                                                         */
+/*  This software, and all works of authorship, whether in source or       */
+/*  object code form as indicated by the copyright notice(s) included      */
+/*  herein (collectively, the "Work") is made available, and may only be   */
+/*  used, modified, and distributed under the FreeType Project License,    */
+/*  LICENSE.TXT.  Additionally, subject to the terms and conditions of the */
+/*  FreeType Project License, each contributor to the Work hereby grants   */
+/*  to any individual or legal entity exercising permissions granted by    */
+/*  the FreeType Project License and this section (hereafter, "You" or     */
+/*  "Your") a perpetual, worldwide, non-exclusive, no-charge,              */
+/*  royalty-free, irrevocable (except as stated in this section) patent    */
+/*  license to make, have made, use, offer to sell, sell, import, and      */
+/*  otherwise transfer the Work, where such license applies only to those  */
+/*  patent claims licensable by such contributor that are necessarily      */
+/*  infringed by their contribution(s) alone or by combination of their    */
+/*  contribution(s) with the Work to which such contribution(s) was        */
+/*  submitted.  If You institute patent litigation against any entity      */
+/*  (including a cross-claim or counterclaim in a lawsuit) alleging that   */
+/*  the Work or a contribution incorporated within the Work constitutes    */
+/*  direct or contributory patent infringement, then any patent licenses   */
+/*  granted to You under this License for that Work shall terminate as of  */
+/*  the date such litigation is filed.                                     */
+/*                                                                         */
+/*  By using, modifying, or distributing the Work you indicate that you    */
+/*  have read and understood the terms and conditions of the               */
+/*  FreeType Project License as well as those provided in this section,    */
+/*  and you accept them fully.                                             */
+/*                                                                         */
+/***************************************************************************/
+
+
+#include "psft.h"
+#include FT_INTERNAL_DEBUG_H
+#include FT_SERVICE_CFF_TABLE_LOAD_H
+
+#include "psglue.h"
+#include "psfont.h"
+#include "psstack.h"
+#include "pshints.h"
+#include "psintrp.h"
+
+#include "pserror.h"
+
+#include "psobjs.h"   /* for cff_random */
+#include "t1decode.h" /* for t1 seac    */
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* 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_cf2interp
+
+
+  FT_LOCAL_DEF( void )
+  cf2_hintmask_init( CF2_HintMask  hintmask,
+                     FT_Error*     error )
+  {
+    FT_ZERO( hintmask );
+
+    hintmask->error = error;
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  cf2_hintmask_isValid( const CF2_HintMask  hintmask )
+  {
+    return hintmask->isValid;
+  }
+
+
+  FT_LOCAL_DEF( FT_Bool )
+  cf2_hintmask_isNew( const CF2_HintMask  hintmask )
+  {
+    return hintmask->isNew;
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_hintmask_setNew( CF2_HintMask  hintmask,
+                       FT_Bool       val )
+  {
+    hintmask->isNew = val;
+  }
+
+
+  /* clients call `getMaskPtr' in order to iterate */
+  /* through hint mask                             */
+
+  FT_LOCAL_DEF( FT_Byte* )
+  cf2_hintmask_getMaskPtr( CF2_HintMask  hintmask )
+  {
+    return hintmask->mask;
+  }
+
+
+  static size_t
+  cf2_hintmask_setCounts( CF2_HintMask  hintmask,
+                          size_t        bitCount )
+  {
+    if ( bitCount > CF2_MAX_HINTS )
+    {
+      /* total of h and v stems must be <= 96 */
+      CF2_SET_ERROR( hintmask->error, Invalid_Glyph_Format );
+      return 0;
+    }
+
+    hintmask->bitCount  = bitCount;
+    hintmask->byteCount = ( hintmask->bitCount + 7 ) / 8;
+
+    hintmask->isValid = TRUE;
+    hintmask->isNew   = TRUE;
+
+    return bitCount;
+  }
+
+
+  /* consume the hintmask bytes from the charstring, advancing the src */
+  /* pointer                                                           */
+  static void
+  cf2_hintmask_read( CF2_HintMask  hintmask,
+                     CF2_Buffer    charstring,
+                     size_t        bitCount )
+  {
+    size_t  i;
+
+#ifndef CF2_NDEBUG
+    /* these are the bits in the final mask byte that should be zero  */
+    /* Note: this variable is only used in an assert expression below */
+    /* and then only if CF2_NDEBUG is not defined                     */
+    CF2_UInt  mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;
+#endif
+
+
+    /* initialize counts and isValid */
+    if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )
+      return;
+
+    FT_ASSERT( hintmask->byteCount > 0 );
+
+    FT_TRACE4(( " (maskbytes:" ));
+
+    /* set mask and advance interpreter's charstring pointer */
+    for ( i = 0; i < hintmask->byteCount; i++ )
+    {
+      hintmask->mask[i] = (FT_Byte)cf2_buf_readByte( charstring );
+      FT_TRACE4(( " 0x%02X", hintmask->mask[i] ));
+    }
+
+    FT_TRACE4(( ")\n" ));
+
+    /* assert any unused bits in last byte are zero unless there's a prior */
+    /* error                                                               */
+    /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1      */
+#ifndef CF2_NDEBUG
+    FT_ASSERT( ( hintmask->mask[hintmask->byteCount - 1] & mask ) == 0 ||
+               *hintmask->error                                        );
+#endif
+  }
+
+
+  FT_LOCAL_DEF( void )
+  cf2_hintmask_setAll( CF2_HintMask  hintmask,
+                       size_t        bitCount )
+  {
+    size_t    i;
+    CF2_UInt  mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1;
+
+
+    /* initialize counts and isValid */
+    if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 )
+      return;
+
+    FT_ASSERT( hintmask->byteCount > 0 );
+    FT_ASSERT( hintmask->byteCount <=
+                 sizeof ( hintmask->mask ) / sizeof ( hintmask->mask[0] ) );
+
+    /* set mask to all ones */
+    for ( i = 0; i < hintmask->byteCount; i++ )
+      hintmask->mask[i] = 0xFF;
+
+    /* clear unused bits                                              */
+    /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */
+    hintmask->mask[hintmask->byteCount - 1] &= ~mask;
+  }
+
+
+  /* Type2 charstring opcodes */
+  enum
+  {
+    cf2_cmdRESERVED_0,   /* 0 */
+    cf2_cmdHSTEM,        /* 1 */
+    cf2_cmdRESERVED_2,   /* 2 */
+    cf2_cmdVSTEM,        /* 3 */
+    cf2_cmdVMOVETO,      /* 4 */
+    cf2_cmdRLINETO,      /* 5 */
+    cf2_cmdHLINETO,      /* 6 */
+    cf2_cmdVLINETO,      /* 7 */
+    cf2_cmdRRCURVETO,    /* 8 */
+    cf2_cmdCLOSEPATH,    /* 9      T1 only */
+    cf2_cmdCALLSUBR,     /* 10 */
+    cf2_cmdRETURN,       /* 11 */
+    cf2_cmdESC,          /* 12 */
+    cf2_cmdHSBW,         /* 13     T1 only */
+    cf2_cmdENDCHAR,      /* 14 */
+    cf2_cmdVSINDEX,      /* 15 */
+    cf2_cmdBLEND,        /* 16 */
+    cf2_cmdRESERVED_17,  /* 17 */
+    cf2_cmdHSTEMHM,      /* 18 */
+    cf2_cmdHINTMASK,     /* 19 */
+    cf2_cmdCNTRMASK,     /* 20 */
+    cf2_cmdRMOVETO,      /* 21 */
+    cf2_cmdHMOVETO,      /* 22 */
+    cf2_cmdVSTEMHM,      /* 23 */
+    cf2_cmdRCURVELINE,   /* 24 */
+    cf2_cmdRLINECURVE,   /* 25 */
+    cf2_cmdVVCURVETO,    /* 26 */
+    cf2_cmdHHCURVETO,    /* 27 */
+    cf2_cmdEXTENDEDNMBR, /* 28 */
+    cf2_cmdCALLGSUBR,    /* 29 */
+    cf2_cmdVHCURVETO,    /* 30 */
+    cf2_cmdHVCURVETO     /* 31 */
+  };
+
+  enum
+  {
+    cf2_escDOTSECTION,   /* 0 */
+    cf2_escVSTEM3,       /* 1      T1 only */
+    cf2_escHSTEM3,       /* 2      T1 only */
+    cf2_escAND,          /* 3 */
+    cf2_escOR,           /* 4 */
+    cf2_escNOT,          /* 5 */
+    cf2_escSEAC,         /* 6      T1 only */
+    cf2_escSBW,          /* 7      T1 only */
+    cf2_escRESERVED_8,   /* 8 */
+    cf2_escABS,          /* 9 */
+    cf2_escADD,          /* 10     like otherADD */
+    cf2_escSUB,          /* 11     like otherSUB */
+    cf2_escDIV,          /* 12 */
+    cf2_escRESERVED_13,  /* 13 */
+    cf2_escNEG,          /* 14 */
+    cf2_escEQ,           /* 15 */
+    cf2_escCALLOTHERSUBR,/* 16     T1 only */
+    cf2_escPOP,          /* 17     T1 only */
+    cf2_escDROP,         /* 18 */
+    cf2_escRESERVED_19,  /* 19 */
+    cf2_escPUT,          /* 20     like otherPUT    */
+    cf2_escGET,          /* 21     like otherGET    */
+    cf2_escIFELSE,       /* 22     like otherIFELSE */
+    cf2_escRANDOM,       /* 23     like otherRANDOM */
+    cf2_escMUL,          /* 24     like otherMUL    */
+    cf2_escRESERVED_25,  /* 25 */
+    cf2_escSQRT,         /* 26 */
+    cf2_escDUP,          /* 27     like otherDUP    */
+    cf2_escEXCH,         /* 28     like otherEXCH   */
+    cf2_escINDEX,        /* 29 */
+    cf2_escROLL,         /* 30 */
+    cf2_escRESERVED_31,  /* 31 */
+    cf2_escRESERVED_32,  /* 32 */
+    cf2_escSETCURRENTPT, /* 33     T1 only */
+    cf2_escHFLEX,        /* 34 */
+    cf2_escFLEX,         /* 35 */
+    cf2_escHFLEX1,       /* 36 */
+    cf2_escFLEX1,        /* 37 */
+    cf2_escRESERVED_38   /* 38     & all higher     */
+  };
+
+
+  /* `stemHintArray' does not change once we start drawing the outline. */
+  static void
+  cf2_doStems( const CF2_Font  font,
+               CF2_Stack       opStack,
+               CF2_ArrStack    stemHintArray,
+               CF2_Fixed*      width,
+               FT_Bool*        haveWidth,
+               CF2_Fixed       hintOffset )
+  {
+    CF2_UInt  i;
+    CF2_UInt  count       = cf2_stack_count( opStack );
+    FT_Bool   hasWidthArg = (FT_Bool)( count & 1 );
+
+    /* variable accumulates delta values from operand stack */
+    CF2_Fixed  position = hintOffset;
+
+    if ( font->isT1 && !font->decoder->flex_state && !*haveWidth )
+      FT_ERROR(( "cf2_doStems (Type 1 mode):"
+                 " No width. Use hsbw/sbw as first op\n" ));
+
+    if ( !font->isT1 && hasWidthArg && !*haveWidth )
+      *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ),
+                          cf2_getNominalWidthX( font->decoder ) );
+
+    if ( font->decoder->width_only )
+      goto exit;
+
+    for ( i = hasWidthArg ? 1 : 0; i < count; i += 2 )
+    {
+      /* construct a CF2_StemHint and push it onto the list */
+      CF2_StemHintRec  stemhint;
+
+
+      stemhint.min =
+      position     = ADD_INT32( position,
+                                cf2_stack_getReal( opStack, i ) );
+      stemhint.max =
+      position     = ADD_INT32( position,
+                                cf2_stack_getReal( opStack, i + 1 ) );
+
+      stemhint.used  = FALSE;
+      stemhint.maxDS =
+      stemhint.minDS = 0;
+
+      cf2_arrstack_push( stemHintArray, &stemhint ); /* defer error check */
+    }
+
+    cf2_stack_clear( opStack );
+
+  exit:
+    /* cf2_doStems must define a width (may be default) */
+    *haveWidth = TRUE;
+  }
+
+
+  static void
+  cf2_doFlex( CF2_Stack       opStack,
+              CF2_Fixed*      curX,
+              CF2_Fixed*      curY,
+              CF2_GlyphPath   glyphPath,
+              const FT_Bool*  readFromStack,
+              FT_Bool         doConditionalLastRead )
+  {
+    CF2_Fixed  vals[14];
+    CF2_UInt   idx;
+    FT_Bool    isHFlex;
+    CF2_Int    top, i, j;
+
+
+    vals[0] = *curX;
+    vals[1] = *curY;
+    idx     = 0;
+    isHFlex = FT_BOOL( readFromStack[9] == FALSE );
+    top     = isHFlex ? 9 : 10;
+
+    for ( i = 0; i < top; i++ )
+    {
+      vals[i + 2] = vals[i];
+      if ( readFromStack[i] )
+        vals[i + 2] = ADD_INT32( vals[i + 2], cf2_stack_getReal( opStack,
+                                                                 idx++ ) );
+    }
+
+    if ( isHFlex )
+      vals[9 + 2] = *curY;
+
+    if ( doConditionalLastRead )
+    {
+      FT_Bool    lastIsX = (FT_Bool)(
+                             cf2_fixedAbs( SUB_INT32( vals[10], *curX ) ) >
+                             cf2_fixedAbs( SUB_INT32( vals[11], *curY ) ) );
+      CF2_Fixed  lastVal = cf2_stack_getReal( opStack, idx );
+
+
+      if ( lastIsX )
+      {
+        vals[12] = ADD_INT32( vals[10], lastVal );
+        vals[13] = *curY;
+      }
+      else
+      {
+        vals[12] = *curX;
+        vals[13] = ADD_INT32( vals[11], lastVal );
+      }
+    }
+    else
+    {
+      if ( readFromStack[10] )
+        vals[12] = ADD_INT32( vals[10],
+                              cf2_stack_getReal( opStack, idx++ ) );
+      else
+        vals[12] = *curX;
+
+      if ( readFromStack[11] )
+        vals[13] = ADD_INT32( vals[11],
+                              cf2_stack_getReal( opStack, idx ) );
+      else
+        vals[13] = *curY;
+    }
+
+    for ( j = 0; j < 2; j++ )
+      cf2_glyphpath_curveTo( glyphPath, vals[j * 6 + 2],
+                                        vals[j * 6 + 3],
+                                        vals[j * 6 + 4],
+                                        vals[j * 6 + 5],
+                                        vals[j * 6 + 6],
+                                        vals[j * 6 + 7] );
+
+    cf2_stack_clear( opStack );
+
+    *curX = vals[12];
+    *curY = vals[13];
+  }
+
+
+  /* Blend numOperands on the stack,                */
+  /* store results into the first numBlends values, */
+  /* then pop remaining arguments.                  */
+  static void
+  cf2_doBlend( const CFF_Blend  blend,
+               CF2_Stack        opStack,
+               CF2_UInt         numBlends )
+  {
+    CF2_UInt  delta;
+    CF2_UInt  base;
+    CF2_UInt  i, j;
+    CF2_UInt  numOperands = (CF2_UInt)( numBlends * blend->lenBV );
+
+
+    base  = cf2_stack_count( opStack ) - numOperands;
+    delta = base + numBlends;
+
+    for ( i = 0; i < numBlends; i++ )
+    {
+      const CF2_Fixed*  weight = &blend->BV[1];
+
+      /* start with first term */
+      CF2_Fixed  sum = cf2_stack_getReal( opStack, i + base );
+
+
+      for ( j = 1; j < blend->lenBV; j++ )
+        sum = ADD_INT32( sum,
+                         FT_MulFix( *weight++,
+                                    cf2_stack_getReal( opStack,
+                                                       delta++ ) ) );
+
+      /* store blended result  */
+      cf2_stack_setReal( opStack, i + base, sum );
+    }
+
+    /* leave only `numBlends' results on stack */
+    cf2_stack_pop( opStack, numOperands - numBlends );
+  }
+
+
+  /*
+   * `error' is a shared error code used by many objects in this
+   * routine.  Before the code continues from an error, it must check and
+   * record the error in `*error'.  The idea is that this shared
+   * error code will record the first error encountered.  If testing
+   * for an error anyway, the cost of `goto exit' is small, so we do it,
+   * even if continuing would be safe.  In this case, `lastError' is
+   * set, so the testing and storing can be done in one place, at `exit'.
+   *
+   * Continuing after an error is intended for objects which do their own
+   * testing of `*error', e.g., array stack functions.  This allows us to
+   * avoid an extra test after the call.
+   *
+   * Unimplemented opcodes are ignored.
+   *
+   */
+  FT_LOCAL_DEF( void )
+  cf2_interpT2CharString( CF2_Font              font,
+                          CF2_Buffer            buf,
+                          CF2_OutlineCallbacks  callbacks,
+                          const FT_Vector*      translation,
+                          FT_Bool               doingSeac,
+                          CF2_Fixed             curX,
+                          CF2_Fixed             curY,
+                          CF2_Fixed*            width )
+  {
+    /* lastError is used for errors that are immediately tested */
+    FT_Error  lastError = FT_Err_Ok;
+
+    /* pointer to parsed font object */
+    PS_Decoder*  decoder = font->decoder;
+
+    FT_Error*  error  = &font->error;
+    FT_Memory  memory = font->memory;
+
+    CF2_Fixed  scaleY        = font->innerTransform.d;
+    CF2_Fixed  nominalWidthX = cf2_getNominalWidthX( decoder );
+
+    /* stuff for Type 1 */
+    FT_Int   known_othersubr_result_cnt = 0;
+    FT_Bool  large_int                  = FALSE;
+    FT_Bool  initial_map_ready          = FALSE;
+
+#define PS_STORAGE_SIZE 3
+    CF2_F16Dot16  results[PS_STORAGE_SIZE];   /* for othersubr results */
+    FT_Int        result_cnt = 0;
+
+    /* save this for hinting seac accents */
+    CF2_Fixed  hintOriginY = curY;
+
+    CF2_Stack  opStack = NULL;
+    FT_UInt    stackSize;
+    FT_Byte    op1;                       /* first opcode byte */
+
+    CF2_F16Dot16  storage[CF2_STORAGE_SIZE];    /* for `put' and `get' */
+    CF2_F16Dot16  flexStore[6];                 /* for Type 1 flex     */
+
+    /* instruction limit; 20,000,000 matches Avalon */
+    FT_UInt32  instructionLimit = 20000000UL;
+
+    CF2_ArrStackRec  subrStack;
+
+    FT_Bool     haveWidth;
+    CF2_Buffer  charstring = NULL;
+
+    CF2_Int  charstringIndex = -1;       /* initialize to empty */
+
+    /* TODO: placeholders for hint structures */
+
+    /* objects used for hinting */
+    CF2_ArrStackRec  hStemHintArray;
+    CF2_ArrStackRec  vStemHintArray;
+
+    CF2_HintMaskRec   hintMask;
+    CF2_GlyphPathRec  glyphPath;
+
+
+    FT_ZERO( &storage );
+    FT_ZERO( &results );
+    FT_ZERO( &flexStore );
+
+    /* initialize the remaining objects */
+    cf2_arrstack_init( &subrStack,
+                       memory,
+                       error,
+                       sizeof ( CF2_BufferRec ) );
+    cf2_arrstack_init( &hStemHintArray,
+                       memory,
+                       error,
+                       sizeof ( CF2_StemHintRec ) );
+    cf2_arrstack_init( &vStemHintArray,
+                       memory,
+                       error,
+                       sizeof ( CF2_StemHintRec ) );
+
+    /* initialize CF2_StemHint arrays */
+    cf2_hintmask_init( &hintMask, error );
+
+    /* initialize path map to manage drawing operations */
+
+    /* Note: last 4 params are used to handle `MoveToPermissive', which */
+    /*       may need to call `hintMap.Build'                           */
+    /* TODO: MoveToPermissive is gone; are these still needed?          */
+    cf2_glyphpath_init( &glyphPath,
+                        font,
+                        callbacks,
+                        scaleY,
+                        /* hShift, */
+                        &hStemHintArray,
+                        &vStemHintArray,
+                        &hintMask,
+                        hintOriginY,
+                        &font->blues,
+                        translation );
+
+    /*
+     * Initialize state for width parsing.  From the CFF Spec:
+     *
+     *   The first stack-clearing operator, which must be one of hstem,
+     *   hstemhm, vstem, vstemhm, cntrmask, hintmask, hmoveto, vmoveto,
+     *   rmoveto, or endchar, takes an additional argument - the width (as
+     *   described earlier), which may be expressed as zero or one numeric
+     *   argument.
+     *
+     * What we implement here uses the first validly specified width, but
+     * does not detect errors for specifying more than one width.
+     *
+     * If one of the above operators occurs without explicitly specifying
+     * a width, we assume the default width.
+     *
+     * CFF2 charstrings always return the default width (0).
+     *
+     */
+    haveWidth = font->isCFF2 ? TRUE : FALSE;
+    *width    = cf2_getDefaultWidthX( decoder );
+
+    /*
+     * Note: At this point, all pointers to resources must be NULL
+     *       and all local objects must be initialized.
+     *       There must be no branches to `exit:' above this point.
+     *
+     */
+
+    /* allocate an operand stack */
+    stackSize = font->isCFF2 ? cf2_getMaxstack( decoder )
+                             : CF2_OPERAND_STACK_SIZE;
+    opStack   = cf2_stack_init( memory, error, stackSize );
+
+    if ( !opStack )
+    {
+      lastError = FT_THROW( Out_Of_Memory );
+      goto exit;
+    }
+
+    /* initialize subroutine stack by placing top level charstring as */
+    /* first element (max depth plus one for the charstring)          */
+    /* Note: Caller owns and must finalize the first charstring.      */
+    /*       Our copy of it does not change that requirement.         */
+    cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 );
+
+    charstring  = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack );
+    *charstring = *buf;    /* structure copy */
+
+    charstringIndex = 0;       /* entry is valid now */
+
+    /* catch errors so far */
+    if ( *error )
+      goto exit;
+
+    /* main interpreter loop */
+    while ( 1 )
+    {
+      if ( font->isT1 )
+        FT_ASSERT( known_othersubr_result_cnt == 0 ||
+                   result_cnt == 0                 );
+
+      if ( cf2_buf_isEnd( charstring ) )
+      {
+        /* If we've reached the end of the charstring, simulate a */
+        /* cf2_cmdRETURN or cf2_cmdENDCHAR.                       */
+        /* We do this for both CFF and CFF2.                      */
+        if ( charstringIndex )
+          op1 = cf2_cmdRETURN;  /* end of buffer for subroutine */
+        else
+          op1 = cf2_cmdENDCHAR; /* end of buffer for top level charstring */
+      }
+      else
+      {
+        op1 = (FT_Byte)cf2_buf_readByte( charstring );
+
+        /* Explicit RETURN and ENDCHAR in CFF2 should be ignored. */
+        /* Note: Trace message will report 0 instead of 11 or 14. */
+        if ( ( op1 == cf2_cmdRETURN || op1 == cf2_cmdENDCHAR ) &&
+             font->isCFF2                                      )
+          op1 = cf2_cmdRESERVED_0;
+      }
+
+      if ( font->isT1 )
+      {
+        if ( !initial_map_ready           &&
+             !( op1 == cf2_cmdHSTEM     ||
+                op1 == cf2_cmdVSTEM     ||
+                op1 == cf2_cmdHSBW      ||
+                op1 == cf2_cmdCALLSUBR  ||
+                op1 == cf2_cmdRETURN    ||
+                op1 == cf2_cmdESC       ||
+                op1 == cf2_cmdENDCHAR   ||
+                op1 >= 32 /* Numbers */ ) )
+        {
+          /* Skip outline commands first time round.       */
+          /* `endchar' will trigger initial hintmap build  */
+          /* and rewind the charstring.                    */
+          cf2_stack_clear( opStack );
+          continue;
+        }
+
+        if ( result_cnt > 0               &&
+             !( op1 == cf2_cmdCALLSUBR  ||
+                op1 == cf2_cmdRETURN    ||
+                op1 == cf2_cmdESC       ||
+                op1 >= 32 /* Numbers */ ) )
+        {
+          /* all operands have been transferred by previous pops */
+          result_cnt = 0;
+        }
+
+        if ( large_int && !( op1 >= 32 || op1 == cf2_escDIV ) )
+        {
+          FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                     " no `div' after large integer\n" ));
+
+          large_int = FALSE;
+        }
+      }
+
+      /* check for errors once per loop */
+      if ( *error )
+        goto exit;
+
+      instructionLimit--;
+      if ( instructionLimit == 0 )
+      {
+        lastError = FT_THROW( Invalid_Glyph_Format );
+        goto exit;
+      }
+
+      switch( op1 )
+      {
+      case cf2_cmdRESERVED_0:
+      case cf2_cmdRESERVED_2:
+      case cf2_cmdRESERVED_17:
+        /* we may get here if we have a prior error */
+        FT_TRACE4(( " unknown op (%d)\n", op1 ));
+        break;
+
+      case cf2_cmdVSINDEX:
+        FT_TRACE4(( " vsindex\n" ));
+
+        if ( !font->isCFF2 )
+          break;    /* clear stack & ignore */
+
+        if ( font->blend.usedBV )
+        {
+          /* vsindex not allowed after blend */
+          lastError = FT_THROW( Invalid_Glyph_Format );
+          goto exit;
+        }
+
+        {
+          FT_Int  temp = cf2_stack_popInt( opStack );
+
+
+          if ( temp >= 0 )
+            font->vsindex = (FT_UInt)temp;
+        }
+        break;
+
+      case cf2_cmdBLEND:
+        {
+          FT_UInt  numBlends;
+
+
+          FT_TRACE4(( " blend\n" ));
+
+          if ( !font->isCFF2 )
+            break;    /* clear stack & ignore */
+
+          /* do we have a `blend' op in a non-variant font? */
+          if ( !font->blend.font )
+          {
+            lastError = FT_THROW( Invalid_Glyph_Format );
+            goto exit;
+          }
+
+          /* check cached blend vector */
+          if ( font->cffload->blend_check_vector( &font->blend,
+                                                  font->vsindex,
+                                                  font->lenNDV,
+                                                  font->NDV ) )
+          {
+            lastError = font->cffload->blend_build_vector( &font->blend,
+                                                           font->vsindex,
+                                                           font->lenNDV,
+                                                           font->NDV );
+            if ( lastError )
+              goto exit;
+          }
+
+          /* do the blend */
+          numBlends = (FT_UInt)cf2_stack_popInt( opStack );
+          if ( numBlends > stackSize )
+          {
+            lastError = FT_THROW( Invalid_Glyph_Format );
+            goto exit;
+          }
+
+          cf2_doBlend( &font->blend, opStack, numBlends );
+
+          font->blend.usedBV = TRUE;
+        }
+        continue;     /* do not clear the stack */
+
+      case cf2_cmdHSTEMHM:
+      case cf2_cmdHSTEM:
+        FT_TRACE4(( op1 == cf2_cmdHSTEMHM ? " hstemhm\n" : " hstem\n" ));
+
+        if ( !font->isT1 )
+        {
+          /* never add hints after the mask is computed */
+          /* except if in Type 1 mode (no hintmask op)  */
+          if ( cf2_hintmask_isValid( &hintMask ) )
+          {
+            FT_TRACE4(( "cf2_interpT2CharString:"
+                        " invalid horizontal hint mask\n" ));
+            break;
+          }
+        }
+
+        /* add left-sidebearing correction in Type 1 mode */
+        cf2_doStems( font,
+                     opStack,
+                     &hStemHintArray,
+                     width,
+                     &haveWidth,
+                     font->isT1 ? decoder->builder.left_bearing->y
+                                : 0 );
+
+        if ( decoder->width_only )
+          goto exit;
+
+        break;
+
+      case cf2_cmdVSTEMHM:
+      case cf2_cmdVSTEM:
+        FT_TRACE4(( op1 == cf2_cmdVSTEMHM ? " vstemhm\n" : " vstem\n" ));
+
+        if ( !font->isT1 )
+        {
+          /* never add hints after the mask is computed */
+          /* except if in Type 1 mode (no hintmask op)  */
+          if ( cf2_hintmask_isValid( &hintMask ) )
+          {
+            FT_TRACE4(( "cf2_interpT2CharString:"
+                        " invalid vertical hint mask\n" ));
+            break;
+          }
+        }
+
+        /* add left-sidebearing correction in Type 1 mode */
+        cf2_doStems( font,
+                     opStack,
+                     &vStemHintArray,
+                     width,
+                     &haveWidth,
+                     font->isT1 ? decoder->builder.left_bearing->x
+                                : 0 );
+
+        if ( decoder->width_only )
+          goto exit;
+
+        break;
+
+      case cf2_cmdVMOVETO:
+        FT_TRACE4(( " vmoveto\n" ));
+
+        if ( font->isT1 && !decoder->flex_state && !haveWidth )
+          FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                     " No width. Use hsbw/sbw as first op\n" ));
+
+        if ( cf2_stack_count( opStack ) > 1 && !haveWidth )
+          *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ),
+                              nominalWidthX );
+
+        /* width is defined or default after this */
+        haveWidth = TRUE;
+
+        if ( decoder->width_only )
+          goto exit;
+
+        curY = ADD_INT32( curY, cf2_stack_popFixed( opStack ) );
+
+        cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+        break;
+
+      case cf2_cmdRLINETO:
+        {
+          CF2_UInt  idx;
+          CF2_UInt  count = cf2_stack_count( opStack );
+
+
+          FT_TRACE4(( " rlineto\n" ));
+
+          for ( idx = 0; idx < count; idx += 2 )
+          {
+            curX = ADD_INT32( curX, cf2_stack_getReal( opStack,
+                                                       idx + 0 ) );
+            curY = ADD_INT32( curY, cf2_stack_getReal( opStack,
+                                                       idx + 1 ) );
+
+            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdHLINETO:
+      case cf2_cmdVLINETO:
+        {
+          CF2_UInt  idx;
+          CF2_UInt  count = cf2_stack_count( opStack );
+
+          FT_Bool  isX = FT_BOOL( op1 == cf2_cmdHLINETO );
+
+
+          FT_TRACE4(( isX ? " hlineto\n" : " vlineto\n" ));
+
+          for ( idx = 0; idx < count; idx++ )
+          {
+            CF2_Fixed  v = cf2_stack_getReal( opStack, idx );
+
+
+            if ( isX )
+              curX = ADD_INT32( curX, v );
+            else
+              curY = ADD_INT32( curY, v );
+
+            isX = !isX;
+
+            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue;
+
+      case cf2_cmdRCURVELINE:
+      case cf2_cmdRRCURVETO:
+        {
+          CF2_UInt  count = cf2_stack_count( opStack );
+          CF2_UInt  idx   = 0;
+
+
+          FT_TRACE4(( op1 == cf2_cmdRCURVELINE ? " rcurveline\n"
+                                               : " rrcurveto\n" ));
+
+          while ( idx + 6 <= count )
+          {
+            CF2_Fixed  x1, y1, x2, y2, x3, y3;
+
+
+            x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX );
+            y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), curY );
+            x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), x1 );
+            y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y1 );
+            x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), x2 );
+            y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 5 ), y2 );
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX  = x3;
+            curY  = y3;
+            idx  += 6;
+          }
+
+          if ( op1 == cf2_cmdRCURVELINE )
+          {
+            curX = ADD_INT32( curX, cf2_stack_getReal( opStack,
+                                                       idx + 0 ) );
+            curY = ADD_INT32( curY, cf2_stack_getReal( opStack,
+                                                       idx + 1 ) );
+
+            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdCLOSEPATH:
+        if ( !font->isT1 )
+          FT_TRACE4(( " unknown op (%d)\n", op1 ));
+        else
+        {
+          FT_TRACE4(( " closepath" ));
+
+          /* if there is no path, `closepath' is a no-op */
+          ps_builder_close_contour( &decoder->builder );
+
+          haveWidth = TRUE;
+        }
+        break;
+
+      case cf2_cmdCALLGSUBR:
+      case cf2_cmdCALLSUBR:
+        {
+          CF2_Int  subrNum;
+
+
+          FT_TRACE4(( op1 == cf2_cmdCALLGSUBR ? " callgsubr"
+                                              : " callsubr" ));
+
+          if ( ( !font->isT1 && charstringIndex > CF2_MAX_SUBR )       ||
+               (  font->isT1 && charstringIndex > T1_MAX_SUBRS_CALLS ) )
+          {
+            /* max subr plus one for charstring */
+            lastError = FT_THROW( Invalid_Glyph_Format );
+            goto exit;                      /* overflow of stack */
+          }
+
+          /* push our current CFF charstring region on subrStack */
+          charstring = (CF2_Buffer)
+                         cf2_arrstack_getPointer(
+                           &subrStack,
+                           (size_t)charstringIndex + 1 );
+
+          /* set up the new CFF region and pointer */
+          subrNum = cf2_stack_popInt( opStack );
+
+          if ( font->isT1 && decoder->locals_hash )
+          {
+            size_t*  val = ft_hash_num_lookup( subrNum,
+                                               decoder->locals_hash );
+
+
+            if ( val )
+              subrNum = *val;
+            else
+              subrNum = -1;
+          }
+
+          switch ( op1 )
+          {
+          case cf2_cmdCALLGSUBR:
+            FT_TRACE4(( " (idx %d, entering level %d)\n",
+                        subrNum + decoder->globals_bias,
+                        charstringIndex + 1 ));
+
+            if ( cf2_initGlobalRegionBuffer( decoder,
+                                             subrNum,
+                                             charstring ) )
+            {
+              lastError = FT_THROW( Invalid_Glyph_Format );
+              goto exit;  /* subroutine lookup or stream error */
+            }
+            break;
+
+          default:
+            /* cf2_cmdCALLSUBR */
+            FT_TRACE4(( " (idx %d, entering level %d)\n",
+                        subrNum + decoder->locals_bias,
+                        charstringIndex + 1 ));
+
+            if ( cf2_initLocalRegionBuffer( decoder,
+                                            subrNum,
+                                            charstring ) )
+            {
+              lastError = FT_THROW( Invalid_Glyph_Format );
+              goto exit;  /* subroutine lookup or stream error */
+            }
+          }
+
+          charstringIndex += 1;       /* entry is valid now */
+        }
+        continue; /* do not clear the stack */
+
+      case cf2_cmdRETURN:
+        FT_TRACE4(( " return (leaving level %d)\n", charstringIndex ));
+
+        if ( charstringIndex < 1 )
+        {
+          /* Note: cannot return from top charstring */
+          lastError = FT_THROW( Invalid_Glyph_Format );
+          goto exit;                      /* underflow of stack */
+        }
+
+        /* restore position in previous charstring */
+        charstring = (CF2_Buffer)
+                       cf2_arrstack_getPointer(
+                         &subrStack,
+                         (CF2_UInt)--charstringIndex );
+        continue;     /* do not clear the stack */
+
+      case cf2_cmdESC:
+        {
+          FT_Byte  op2 = (FT_Byte)cf2_buf_readByte( charstring );
+
+
+          /* first switch for 2-byte operators handles CFF2      */
+          /* and opcodes that are reserved for both CFF and CFF2 */
+          switch ( op2 )
+          {
+          case cf2_escHFLEX:
+            {
+              static const FT_Bool  readFromStack[12] =
+              {
+                TRUE /* dx1 */, FALSE /* dy1 */,
+                TRUE /* dx2 */, TRUE  /* dy2 */,
+                TRUE /* dx3 */, FALSE /* dy3 */,
+                TRUE /* dx4 */, FALSE /* dy4 */,
+                TRUE /* dx5 */, FALSE /* dy5 */,
+                TRUE /* dx6 */, FALSE /* dy6 */
+              };
+
+
+              FT_TRACE4(( " hflex\n" ));
+
+              cf2_doFlex( opStack,
+                          &curX,
+                          &curY,
+                          &glyphPath,
+                          readFromStack,
+                          FALSE /* doConditionalLastRead */ );
+            }
+            continue;
+
+          case cf2_escFLEX:
+            {
+              static const FT_Bool  readFromStack[12] =
+              {
+                TRUE /* dx1 */, TRUE /* dy1 */,
+                TRUE /* dx2 */, TRUE /* dy2 */,
+                TRUE /* dx3 */, TRUE /* dy3 */,
+                TRUE /* dx4 */, TRUE /* dy4 */,
+                TRUE /* dx5 */, TRUE /* dy5 */,
+                TRUE /* dx6 */, TRUE /* dy6 */
+              };
+
+
+              FT_TRACE4(( " flex\n" ));
+
+              cf2_doFlex( opStack,
+                          &curX,
+                          &curY,
+                          &glyphPath,
+                          readFromStack,
+                          FALSE /* doConditionalLastRead */ );
+            }
+            break;      /* TODO: why is this not a continue? */
+
+          case cf2_escHFLEX1:
+            {
+              static const FT_Bool  readFromStack[12] =
+              {
+                TRUE /* dx1 */, TRUE  /* dy1 */,
+                TRUE /* dx2 */, TRUE  /* dy2 */,
+                TRUE /* dx3 */, FALSE /* dy3 */,
+                TRUE /* dx4 */, FALSE /* dy4 */,
+                TRUE /* dx5 */, TRUE  /* dy5 */,
+                TRUE /* dx6 */, FALSE /* dy6 */
+              };
+
+
+              FT_TRACE4(( " hflex1\n" ));
+
+              cf2_doFlex( opStack,
+                          &curX,
+                          &curY,
+                          &glyphPath,
+                          readFromStack,
+                          FALSE /* doConditionalLastRead */ );
+            }
+            continue;
+
+          case cf2_escFLEX1:
+            {
+              static const FT_Bool  readFromStack[12] =
+              {
+                TRUE  /* dx1 */, TRUE  /* dy1 */,
+                TRUE  /* dx2 */, TRUE  /* dy2 */,
+                TRUE  /* dx3 */, TRUE  /* dy3 */,
+                TRUE  /* dx4 */, TRUE  /* dy4 */,
+                TRUE  /* dx5 */, TRUE  /* dy5 */,
+                FALSE /* dx6 */, FALSE /* dy6 */
+              };
+
+
+              FT_TRACE4(( " flex1\n" ));
+
+              cf2_doFlex( opStack,
+                          &curX,
+                          &curY,
+                          &glyphPath,
+                          readFromStack,
+                          TRUE /* doConditionalLastRead */ );
+            }
+            continue;
+
+          /* these opcodes are always reserved */
+          case cf2_escRESERVED_8:
+          case cf2_escRESERVED_13:
+          case cf2_escRESERVED_19:
+          case cf2_escRESERVED_25:
+          case cf2_escRESERVED_31:
+          case cf2_escRESERVED_32:
+            FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+            break;
+
+          default:
+            {
+              if ( font->isCFF2 || op2 >= cf2_escRESERVED_38 )
+                FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+              else if ( font->isT1 && result_cnt > 0 && op2 != cf2_escPOP )
+              {
+                /* all operands have been transferred by previous pops */
+                result_cnt = 0;
+              }
+              else
+              {
+                /* second switch for 2-byte operators handles */
+                /* CFF and Type 1                             */
+                switch ( op2 )
+                {
+
+                case cf2_escDOTSECTION:
+                  /* something about `flip type of locking' -- ignore it */
+                  FT_TRACE4(( " dotsection\n" ));
+
+                  break;
+
+                case cf2_escVSTEM3:
+                case cf2_escHSTEM3:
+                  /*
+                   * Type 1:                          Type 2:
+                   *   x0 dx0 x1 dx1 x2 dx2 vstem3      x dx {dxa dxb}* vstem
+                   *   y0 dy0 y1 dy1 y2 dy2 hstem3      y dy {dya dyb}* hstem
+                   *   relative to lsb point            relative to zero
+                   *
+                   */
+                  {
+                    if ( !font->isT1 )
+                      FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+                    else
+                    {
+                      CF2_F16Dot16  v0, v1, v2;
+
+                      FT_Bool  isV = FT_BOOL( op2 == cf2_escVSTEM3 );
+
+
+                      FT_TRACE4(( isV ? " vstem3\n"
+                                      : " hstem3\n" ));
+
+                      FT_ASSERT( cf2_stack_count( opStack ) == 6 );
+
+                      v0 = cf2_stack_getReal( opStack, 0 );
+                      v1 = cf2_stack_getReal( opStack, 2 );
+                      v2 = cf2_stack_getReal( opStack, 4 );
+
+                      cf2_stack_setReal(
+                        opStack, 2,
+                        SUB_INT32( SUB_INT32( v1, v0 ),
+                                   cf2_stack_getReal( opStack, 1 ) ) );
+                      cf2_stack_setReal(
+                        opStack, 4,
+                        SUB_INT32( SUB_INT32( v2, v1 ),
+                                   cf2_stack_getReal( opStack, 3 ) ) );
+
+                      /* add left-sidebearing correction */
+                      cf2_doStems( font,
+                                   opStack,
+                                   isV ? &vStemHintArray : &hStemHintArray,
+                                   width,
+                                   &haveWidth,
+                                   isV ? decoder->builder.left_bearing->x
+                                       : decoder->builder.left_bearing->y );
+
+                      if ( decoder->width_only )
+                        goto exit;
+                    }
+                  }
+                  break;
+
+                case cf2_escAND:
+                  {
+                    CF2_F16Dot16  arg1;
+                    CF2_F16Dot16  arg2;
+
+
+                    FT_TRACE4(( " and\n" ));
+
+                    arg2 = cf2_stack_popFixed( opStack );
+                    arg1 = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushInt( opStack, arg1 && arg2 );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escOR:
+                  {
+                    CF2_F16Dot16  arg1;
+                    CF2_F16Dot16  arg2;
+
+
+                    FT_TRACE4(( " or\n" ));
+
+                    arg2 = cf2_stack_popFixed( opStack );
+                    arg1 = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushInt( opStack, arg1 || arg2 );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escNOT:
+                  {
+                    CF2_F16Dot16  arg;
+
+
+                    FT_TRACE4(( " not\n" ));
+
+                    arg = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushInt( opStack, !arg );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escSEAC:
+                  if ( !font->isT1 )
+                    FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+                  else
+                  {
+                    FT_Error   error2;
+                    CF2_Int    bchar_index, achar_index;
+                    FT_Vector  left_bearing, advance;
+
+#ifdef FT_CONFIG_OPTION_INCREMENTAL
+                    T1_Face  face = (T1_Face)decoder->builder.face;
+#endif
+                    CF2_BufferRec  component;
+                    CF2_Fixed      dummyWidth;
+
+                    CF2_Int  achar = cf2_stack_popInt( opStack );
+                    CF2_Int  bchar = cf2_stack_popInt( opStack );
+
+                    FT_Pos  ady = cf2_stack_popFixed ( opStack );
+                    FT_Pos  adx = cf2_stack_popFixed ( opStack );
+                    FT_Pos  asb = cf2_stack_popFixed ( opStack );
+
+
+                    FT_TRACE4(( " seac\n" ));
+
+                    if ( doingSeac )
+                    {
+                      FT_ERROR(( " nested seac\n" ));
+                      lastError = FT_THROW( Invalid_Glyph_Format );
+                      goto exit;      /* nested seac */
+                    }
+
+                    if ( decoder->builder.metrics_only )
+                    {
+                      FT_ERROR(( " unexpected seac\n" ));
+                      lastError = FT_THROW( Invalid_Glyph_Format );
+                      goto exit;      /* unexpected seac */
+                    }
+
+                    /* `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((
+                          "cf2_interpT2CharString: (Type 1 seac)"
+                          " glyph names table not available in this font\n" ));
+                        lastError = FT_THROW( Invalid_Glyph_Format );
+                        goto exit;
+                      }
+
+                    /* seac weirdness */
+                    adx += decoder->builder.left_bearing->x;
+
+#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_ps(
+                                      decoder, bchar );
+                      achar_index = t1_lookup_glyph_by_stdcharcode_ps(
+                                      decoder, achar );
+                    }
+
+                    if ( bchar_index < 0 || achar_index < 0 )
+                    {
+                      FT_ERROR((
+                        "cf2_interpT2CharString: (Type 1 seac)"
+                        " invalid seac character code arguments\n" ));
+                      lastError = FT_THROW( Invalid_Glyph_Format );
+                      goto exit;
+                    }
+
+                    /* 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 */
+                      error2 = FT_GlyphLoader_CheckSubGlyphs( loader, 2 );
+                      if ( error2 )
+                      {
+                        lastError = error2; /* pass FreeType error through */
+                        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 */
+
+                    /* prepare loader */
+                    FT_GlyphLoader_Prepare( decoder->builder.loader );
+
+                    error2 = cf2_getT1SeacComponent( decoder,
+                                                     (FT_UInt)bchar_index,
+                                                     &component );
+                    if ( error2 )
+                    {
+                      lastError = error2; /* pass FreeType error through */
+                      goto exit;
+                    }
+                    cf2_interpT2CharString( font,
+                                            &component,
+                                            callbacks,
+                                            translation,
+                                            TRUE,
+                                            0,
+                                            0,
+                                            &dummyWidth );
+                    cf2_freeT1SeacComponent( decoder, &component );
+
+                    /* 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;
+
+                    /* Now load `achar' on top of */
+                    /* the base outline           */
+
+                    error2 = cf2_getT1SeacComponent( decoder,
+                                                     (FT_UInt)achar_index,
+                                                     &component );
+                    if ( error2 )
+                    {
+                      lastError = error2; /* pass FreeType error through */
+                      goto exit;
+                    }
+                    cf2_interpT2CharString( font,
+                                            &component,
+                                            callbacks,
+                                            translation,
+                                            TRUE,
+                                            adx - asb,
+                                            ady,
+                                            &dummyWidth );
+                    cf2_freeT1SeacComponent( decoder, &component );
+
+                    /* restore the left side bearing and   */
+                    /* advance width of the base character */
+
+                    *decoder->builder.left_bearing = left_bearing;
+                    *decoder->builder.advance      = advance;
+
+                    goto exit;
+                  }
+                  break;
+
+                case cf2_escSBW:
+                  if ( !font->isT1 )
+                    FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+                  else
+                  {
+                    CF2_Fixed    lsb_x, lsb_y;
+                    PS_Builder*  builder;
+
+
+                    FT_TRACE4(( " sbw" ));
+
+                    builder = &decoder->builder;
+
+                    builder->advance->y = cf2_stack_popFixed( opStack );
+                    builder->advance->x = cf2_stack_popFixed( opStack );
+
+                    lsb_y = cf2_stack_popFixed( opStack );
+                    lsb_x = cf2_stack_popFixed( opStack );
+
+                    builder->left_bearing->x =
+                      ADD_INT32( builder->left_bearing->x, lsb_x );
+                    builder->left_bearing->y =
+                      ADD_INT32( builder->left_bearing->y, lsb_y );
+
+                    haveWidth = TRUE;
+
+                    /* 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 )
+                      goto exit;
+
+                    if ( initial_map_ready )
+                    {
+                      curX = ADD_INT32( curX, lsb_x );
+                      curY = ADD_INT32( curY, lsb_y );
+                    }
+                  }
+                  break;
+
+                case cf2_escABS:
+                  {
+                    CF2_F16Dot16  arg;
+
+
+                    FT_TRACE4(( " abs\n" ));
+
+                    arg = cf2_stack_popFixed( opStack );
+
+                    if ( arg < -CF2_FIXED_MAX )
+                      cf2_stack_pushFixed( opStack, CF2_FIXED_MAX );
+                    else
+                      cf2_stack_pushFixed( opStack, FT_ABS( arg ) );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escADD:
+                  {
+                    CF2_F16Dot16  summand1;
+                    CF2_F16Dot16  summand2;
+
+
+                    FT_TRACE4(( " add\n" ));
+
+                    summand2 = cf2_stack_popFixed( opStack );
+                    summand1 = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushFixed( opStack,
+                                         ADD_INT32( summand1,
+                                                    summand2 ) );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escSUB:
+                  {
+                    CF2_F16Dot16  minuend;
+                    CF2_F16Dot16  subtrahend;
+
+
+                    FT_TRACE4(( " sub\n" ));
+
+                    subtrahend = cf2_stack_popFixed( opStack );
+                    minuend    = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushFixed( opStack,
+                                         SUB_INT32( minuend, subtrahend ) );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escDIV:
+                  {
+                    CF2_F16Dot16  dividend;
+                    CF2_F16Dot16  divisor;
+
+
+                    FT_TRACE4(( " div\n" ));
+
+                    if ( font->isT1 && large_int )
+                    {
+                      divisor  = (CF2_F16Dot16)cf2_stack_popInt( opStack );
+                      dividend = (CF2_F16Dot16)cf2_stack_popInt( opStack );
+
+                      large_int = FALSE;
+                    }
+                    else
+                    {
+                      divisor  = cf2_stack_popFixed( opStack );
+                      dividend = cf2_stack_popFixed( opStack );
+                    }
+
+                    cf2_stack_pushFixed( opStack,
+                                         FT_DivFix( dividend, divisor ) );
+
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escNEG:
+                  {
+                    CF2_F16Dot16  arg;
+
+
+                    FT_TRACE4(( " neg\n" ));
+
+                    arg = cf2_stack_popFixed( opStack );
+
+                    if ( arg < -CF2_FIXED_MAX )
+                      cf2_stack_pushFixed( opStack, CF2_FIXED_MAX );
+                    else
+                      cf2_stack_pushFixed( opStack, -arg );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escEQ:
+                  {
+                    CF2_F16Dot16  arg1;
+                    CF2_F16Dot16  arg2;
+
+
+                    FT_TRACE4(( " eq\n" ));
+
+                    arg2 = cf2_stack_popFixed( opStack );
+                    arg1 = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushInt( opStack, arg1 == arg2 );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escCALLOTHERSUBR:
+                  if ( !font->isT1 )
+                    FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+                  else
+                  {
+                    CF2_Int   subr_no;
+                    CF2_Int   arg_cnt;
+                    CF2_UInt  count;
+                    CF2_UInt  opIdx = 0;
+
+
+                    FT_TRACE4(( " callothersubr\n" ));
+
+                    subr_no = cf2_stack_popInt( opStack );
+                    arg_cnt = cf2_stack_popInt( opStack );
+
+                    /*******************************************************/
+                    /*                                                     */
+                    /* 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                      */
+
+                    count = cf2_stack_count( opStack );
+                    FT_ASSERT( (CF2_UInt)arg_cnt <= count );
+
+                    opIdx += count - (CF2_UInt)arg_cnt;
+
+                    known_othersubr_result_cnt = 0;
+                    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 ( initial_map_ready &&
+                           ( !decoder->flex_state           ||
+                             decoder->num_flex_vectors != 7 ) )
+                      {
+                        FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                                   " unexpected flex end\n" ));
+                        lastError = FT_THROW( Invalid_Glyph_Format );
+                        goto exit;
+                      }
+
+                      /* the two `results' are popped     */
+                      /* by the following setcurrentpoint */
+                      cf2_stack_pushFixed( opStack, curX );
+                      cf2_stack_pushFixed( opStack, curY );
+                      known_othersubr_result_cnt = 2;
+                      break;
+
+                    case 1:                     /* start flex feature */
+                      if ( arg_cnt != 0 )
+                        goto Unexpected_OtherSubr;
+
+                      if ( !initial_map_ready )
+                        break;
+
+                      if ( ps_builder_check_points( &decoder->builder, 6 ) )
+                        goto exit;
+
+                      decoder->flex_state        = 1;
+                      decoder->num_flex_vectors  = 0;
+                      break;
+
+                    case 2:                     /* add flex vectors */
+                      {
+                        FT_Int  idx;
+                        FT_Int  idx2;
+
+
+                        if ( arg_cnt != 0 )
+                          goto Unexpected_OtherSubr;
+
+                        if ( !initial_map_ready )
+                          break;
+
+                        if ( !decoder->flex_state )
+                        {
+                          FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                                     " missing flex start\n" ));
+                          lastError = FT_THROW( Invalid_Glyph_Format );
+                          goto exit;
+                        }
+
+                        /* 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 )
+                        {
+                          /* in malformed fonts it is possible to have    */
+                          /* other opcodes in the middle of a flex (which */
+                          /* don't increase `num_flex_vectors'); we thus  */
+                          /* have to check whether we can add a point     */
+
+                          if ( ps_builder_check_points( &decoder->builder,
+                                                        1 ) )
+                          {
+                            lastError = FT_THROW( Invalid_Glyph_Format );
+                            goto exit;
+                          }
+
+                          /* map: 1->2 2->4 3->6 4->2 5->4 6->6 */
+                          idx2 = ( idx > 3 ? idx - 3 : idx ) * 2;
+
+                          flexStore[idx2 - 2] = curX;
+                          flexStore[idx2 - 1] = curY;
+
+                          if ( idx == 3 || idx == 6 )
+                            cf2_glyphpath_curveTo( &glyphPath,
+                                                   flexStore[0],
+                                                   flexStore[1],
+                                                   flexStore[2],
+                                                   flexStore[3],
+                                                   flexStore[4],
+                                                   flexStore[5] );
+                        }
+                      }
+                      break;
+
+                    case 3:                     /* change hints */
+                      if ( arg_cnt != 1 )
+                        goto Unexpected_OtherSubr;
+
+                      if ( initial_map_ready )
+                      {
+                        /* do not clear hints if initial hintmap */
+                        /* is not ready - we need to collate all */
+                        cf2_arrstack_clear( &vStemHintArray );
+                        cf2_arrstack_clear( &hStemHintArray );
+
+                        cf2_hintmask_init( &hintMask, error );
+                        hintMask.isValid = FALSE;
+                        hintMask.isNew   = TRUE;
+                      }
+
+                      known_othersubr_result_cnt = 1;
+                      break;
+
+                    case 12:
+                    case 13:
+                      /* counter control hints, clear stack */
+                      cf2_stack_clear( opStack );
+                      break;
+
+                    case 14:
+                    case 15:
+                    case 16:
+                    case 17:
+                    case 18:                    /* multiple masters */
+                      {
+                        PS_Blend  blend = decoder->blend;
+                        FT_UInt   num_points, nn, mm;
+                        CF2_UInt  delta;
+                        CF2_UInt  values;
+
+
+                        if ( !blend )
+                        {
+                          FT_ERROR((
+                            "cf2_interpT2CharString:"
+                            " unexpected multiple masters operator\n" ));
+                          lastError = FT_THROW( Invalid_Glyph_Format );
+                          goto exit;
+                        }
+
+                        num_points = (FT_UInt)subr_no - 13 +
+                                       ( subr_no == 18 );
+                        if ( arg_cnt != (FT_Int)( num_points *
+                                                  blend->num_designs ) )
+                        {
+                          FT_ERROR((
+                            "cf2_interpT2CharString:"
+                            " incorrect number of multiple masters arguments\n" ));
+                          lastError = FT_THROW( Invalid_Glyph_Format );
+                          goto exit;
+                        }
+
+                        /* 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  = opIdx + num_points;
+                        values = opIdx;
+                        for ( nn = 0; nn < num_points; nn++ )
+                        {
+                          CF2_Fixed  tmp = cf2_stack_getReal( opStack,
+                                                              values );
+
+
+                          for ( mm = 1; mm < blend->num_designs; mm++ )
+                            tmp = ADD_INT32( tmp,
+                                             FT_MulFix(
+                                               cf2_stack_getReal( opStack,
+                                                                  delta++ ),
+                                               blend->weight_vector[mm] ) );
+
+                          cf2_stack_setReal( opStack, values++, tmp );
+                        }
+                        cf2_stack_pop( opStack,
+                                       (CF2_UInt)arg_cnt - num_points );
+
+                        known_othersubr_result_cnt = (FT_Int)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 )
+                          goto Unexpected_OtherSubr;
+
+                        idx = cf2_stack_popInt( opStack );
+
+                        if ( idx < 0                             ||
+                             (FT_UInt)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 */
+                      {
+                        CF2_F16Dot16  summand1;
+                        CF2_F16Dot16  summand2;
+
+
+                        if ( arg_cnt != 2 )
+                          goto Unexpected_OtherSubr;
+
+                        summand2 = cf2_stack_popFixed( opStack );
+                        summand1 = cf2_stack_popFixed( opStack );
+
+                        cf2_stack_pushFixed( opStack,
+                                             ADD_INT32( summand1,
+                                                        summand2 ) );
+                        known_othersubr_result_cnt = 1;
+                      }
+                      break;
+
+                    case 21:
+                      /* <arg1> <arg2> 2 21 callothersubr pop   */
+                      /* ==> push <arg1> - <arg2> onto T1 stack */
+                      {
+                        CF2_F16Dot16  minuend;
+                        CF2_F16Dot16  subtrahend;
+
+
+                        if ( arg_cnt != 2 )
+                          goto Unexpected_OtherSubr;
+
+                        subtrahend = cf2_stack_popFixed( opStack );
+                        minuend    = cf2_stack_popFixed( opStack );
+
+                        cf2_stack_pushFixed( opStack,
+                                             SUB_INT32( minuend,
+                                                        subtrahend ) );
+                        known_othersubr_result_cnt = 1;
+                      }
+                      break;
+
+                    case 22:
+                      /* <arg1> <arg2> 2 22 callothersubr pop   */
+                      /* ==> push <arg1> * <arg2> onto T1 stack */
+                      {
+                        CF2_F16Dot16  factor1;
+                        CF2_F16Dot16  factor2;
+
+
+                        if ( arg_cnt != 2 )
+                          goto Unexpected_OtherSubr;
+
+                        factor2 = cf2_stack_popFixed( opStack );
+                        factor1 = cf2_stack_popFixed( opStack );
+
+                        cf2_stack_pushFixed( opStack,
+                                             FT_MulFix( factor1, factor2 ) );
+                        known_othersubr_result_cnt = 1;
+                      }
+                      break;
+
+                    case 23:
+                      /* <arg1> <arg2> 2 23 callothersubr pop   */
+                      /* ==> push <arg1> / <arg2> onto T1 stack */
+                      {
+                        CF2_F16Dot16  dividend;
+                        CF2_F16Dot16  divisor;
+
+
+                        if ( arg_cnt != 2 )
+                          goto Unexpected_OtherSubr;
+
+                        divisor  = cf2_stack_popFixed( opStack );
+                        dividend = cf2_stack_popFixed( opStack );
+
+                        if ( divisor == 0 )
+                          goto Unexpected_OtherSubr;
+
+                        cf2_stack_pushFixed( opStack,
+                                             FT_DivFix( dividend,
+                                                        divisor ) );
+                        known_othersubr_result_cnt = 1;
+                      }
+                      break;
+
+                    case 24:
+                      /* <val> <idx> 2 24 callothersubr               */
+                      /* ==> set BuildCharArray[cvi( <idx> )] = <val> */
+                      {
+                        CF2_Int   idx;
+                        PS_Blend  blend = decoder->blend;
+
+
+                        if ( arg_cnt != 2 || !blend )
+                          goto Unexpected_OtherSubr;
+
+                        idx = cf2_stack_popInt( opStack );
+
+                        if ( idx < 0                                ||
+                             (FT_UInt)idx >= decoder->len_buildchar )
+                          goto Unexpected_OtherSubr;
+
+                        decoder->buildchar[idx] =
+                          cf2_stack_popFixed( opStack );
+                      }
+                      break;
+
+                    case 25:
+                      /* <idx> 1 25 callothersubr pop        */
+                      /* ==> push BuildCharArray[cvi( idx )] */
+                      /*     onto T1 stack                   */
+                      {
+                        CF2_Int   idx;
+                        PS_Blend  blend = decoder->blend;
+
+
+                        if ( arg_cnt != 1 || !blend )
+                          goto Unexpected_OtherSubr;
+
+                        idx = cf2_stack_popInt( opStack );
+
+                        if ( idx < 0                                ||
+                             (FT_UInt)idx >= decoder->len_buildchar )
+                          goto Unexpected_OtherSubr;
+
+                        cf2_stack_pushFixed( opStack,
+                                             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
+                      XXX (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>                          */
+                      {
+                        CF2_F16Dot16  arg1;
+                        CF2_F16Dot16  arg2;
+                        CF2_F16Dot16  cond1;
+                        CF2_F16Dot16  cond2;
+
+
+                        if ( arg_cnt != 4 )
+                          goto Unexpected_OtherSubr;
+
+                        cond2 = cf2_stack_popFixed( opStack );
+                        cond1 = cf2_stack_popFixed( opStack );
+                        arg2  = cf2_stack_popFixed( opStack );
+                        arg1  = cf2_stack_popFixed( opStack );
+
+                        cf2_stack_pushFixed( opStack,
+                                             cond1 <= cond2 ? arg1 : arg2 );
+                        known_othersubr_result_cnt = 1;
+                      }
+                      break;
+
+                    case 28:
+                      /* 0 28 callothersubr pop                     */
+                      /* ==> push random value from interval [0, 1) */
+                      /*     onto stack                             */
+                      {
+                        CF2_F16Dot16  r;
+
+
+                        if ( arg_cnt != 0 )
+                          goto Unexpected_OtherSubr;
+
+                        /* only use the lower 16 bits of `random'  */
+                        /* to generate a number in the range (0;1] */
+                        r = (CF2_F16Dot16)
+                              ( ( decoder->current_subfont->random & 0xFFFF ) + 1 );
+
+                        decoder->current_subfont->random =
+                          cff_random( decoder->current_subfont->random );
+
+                        cf2_stack_pushFixed( opStack, r );
+                        known_othersubr_result_cnt = 1;
+                      }
+                      break;
+
+                    default:
+                      if ( arg_cnt >= 0 && subr_no >= 0 )
+                      {
+                        FT_Int  i;
+
+
+                        FT_ERROR((
+                          "cf2_interpT2CharString (Type 1 mode):"
+                          " unknown othersubr [%d %d], wish me luck\n",
+                          arg_cnt, subr_no ));
+
+                        /* store the unused args        */
+                        /* for this unhandled OtherSubr */
+
+                        if ( arg_cnt > PS_STORAGE_SIZE )
+                          arg_cnt = PS_STORAGE_SIZE;
+                        result_cnt = arg_cnt;
+
+                        for ( i = 1; i <= arg_cnt; i++ )
+                          results[result_cnt - i] =
+                            cf2_stack_popFixed( opStack );
+
+                        break;
+                      }
+                      /* fall through */
+
+                    Unexpected_OtherSubr:
+                      FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                                 " invalid othersubr [%d %d]\n",
+                                 arg_cnt, subr_no ));
+                      lastError = FT_THROW( Invalid_Glyph_Format );
+                      goto exit;
+                    }
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escPOP:
+                  if ( !font->isT1 )
+                    FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+                  else
+                  {
+                    FT_TRACE4(( " pop" ));
+
+                    if ( known_othersubr_result_cnt > 0 )
+                    {
+                      known_othersubr_result_cnt--;
+                      /* ignore, we pushed the operands ourselves */
+                      continue;
+                    }
+
+                    if ( result_cnt == 0 )
+                    {
+                      FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                                 " no more operands for othersubr\n" ));
+                      lastError = FT_THROW( Invalid_Glyph_Format );
+                      goto exit;
+                    }
+
+                    result_cnt--;
+                    cf2_stack_pushFixed( opStack, results[result_cnt] );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escDROP:
+                  FT_TRACE4(( " drop\n" ));
+
+                  (void)cf2_stack_popFixed( opStack );
+                  continue; /* do not clear the stack */
+
+                case cf2_escPUT:
+                  {
+                    CF2_F16Dot16  val;
+                    CF2_Int       idx;
+
+
+                    FT_TRACE4(( " put\n" ));
+
+                    idx = cf2_stack_popInt( opStack );
+                    val = cf2_stack_popFixed( opStack );
+
+                    if ( idx >= 0 && idx < CF2_STORAGE_SIZE )
+                      storage[idx] = val;
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escGET:
+                  {
+                    CF2_Int  idx;
+
+
+                    FT_TRACE4(( " get\n" ));
+
+                    idx = cf2_stack_popInt( opStack );
+
+                    if ( idx >= 0 && idx < CF2_STORAGE_SIZE )
+                      cf2_stack_pushFixed( opStack, storage[idx] );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escIFELSE:
+                  {
+                    CF2_F16Dot16  arg1;
+                    CF2_F16Dot16  arg2;
+                    CF2_F16Dot16  cond1;
+                    CF2_F16Dot16  cond2;
+
+
+                    FT_TRACE4(( " ifelse\n" ));
+
+                    cond2 = cf2_stack_popFixed( opStack );
+                    cond1 = cf2_stack_popFixed( opStack );
+                    arg2  = cf2_stack_popFixed( opStack );
+                    arg1  = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushFixed( opStack,
+                                         cond1 <= cond2 ? arg1 : arg2 );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escRANDOM: /* in spec */
+                  {
+                    CF2_F16Dot16  r;
+
+
+                    FT_TRACE4(( " random\n" ));
+
+                    /* only use the lower 16 bits of `random'  */
+                    /* to generate a number in the range (0;1] */
+                    r = (CF2_F16Dot16)
+                          ( ( decoder->current_subfont->random & 0xFFFF ) + 1 );
+
+                    decoder->current_subfont->random =
+                      cff_random( decoder->current_subfont->random );
+
+                    cf2_stack_pushFixed( opStack, r );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escMUL:
+                  {
+                    CF2_F16Dot16  factor1;
+                    CF2_F16Dot16  factor2;
+
+
+                    FT_TRACE4(( " mul\n" ));
+
+                    factor2 = cf2_stack_popFixed( opStack );
+                    factor1 = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushFixed( opStack,
+                                         FT_MulFix( factor1, factor2 ) );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escSQRT:
+                  {
+                    CF2_F16Dot16  arg;
+
+
+                    FT_TRACE4(( " sqrt\n" ));
+
+                    arg = cf2_stack_popFixed( opStack );
+                    if ( arg > 0 )
+                    {
+                      /* use a start value that doesn't make */
+                      /* the algorithm's addition overflow   */
+                      FT_Fixed  root = arg < 10 ? arg : arg >> 1;
+                      FT_Fixed  new_root;
+
+
+                      /* Babylonian method */
+                      for (;;)
+                      {
+                        new_root = ( root + FT_DivFix( arg, root ) + 1 ) >> 1;
+                        if ( new_root == root )
+                          break;
+                        root = new_root;
+                      }
+                      arg = new_root;
+                    }
+                    else
+                      arg = 0;
+
+                    cf2_stack_pushFixed( opStack, arg );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escDUP:
+                  {
+                    CF2_F16Dot16  arg;
+
+
+                    FT_TRACE4(( " dup\n" ));
+
+                    arg = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushFixed( opStack, arg );
+                    cf2_stack_pushFixed( opStack, arg );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escEXCH:
+                  {
+                    CF2_F16Dot16  arg1;
+                    CF2_F16Dot16  arg2;
+
+
+                    FT_TRACE4(( " exch\n" ));
+
+                    arg2 = cf2_stack_popFixed( opStack );
+                    arg1 = cf2_stack_popFixed( opStack );
+
+                    cf2_stack_pushFixed( opStack, arg2 );
+                    cf2_stack_pushFixed( opStack, arg1 );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escINDEX:
+                  {
+                    CF2_Int   idx;
+                    CF2_UInt  size;
+
+
+                    FT_TRACE4(( " index\n" ));
+
+                    idx  = cf2_stack_popInt( opStack );
+                    size = cf2_stack_count( opStack );
+
+                    if ( size > 0 )
+                    {
+                      /* for `cf2_stack_getReal',   */
+                      /* index 0 is bottom of stack */
+                      CF2_UInt  gr_idx;
+
+
+                      if ( idx < 0 )
+                        gr_idx = size - 1;
+                      else if ( (CF2_UInt)idx >= size )
+                        gr_idx = 0;
+                      else
+                        gr_idx = size - 1 - (CF2_UInt)idx;
+
+                      cf2_stack_pushFixed( opStack,
+                                           cf2_stack_getReal( opStack,
+                                                              gr_idx ) );
+                    }
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escROLL:
+                  {
+                    CF2_Int  idx;
+                    CF2_Int  count;
+
+
+                    FT_TRACE4(( " roll\n" ));
+
+                    idx   = cf2_stack_popInt( opStack );
+                    count = cf2_stack_popInt( opStack );
+
+                    cf2_stack_roll( opStack, count, idx );
+                  }
+                  continue; /* do not clear the stack */
+
+                case cf2_escSETCURRENTPT:
+                  if ( !font->isT1 )
+                    FT_TRACE4(( " unknown op (12, %d)\n", op2 ));
+                  else
+                  {
+                    FT_TRACE4(( " setcurrentpoint" ));
+
+                    if ( !initial_map_ready )
+                      break;
+
+                    /* 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(( "cf2_interpT2CharString:"
+                                 " unexpected `setcurrentpoint'\n" ));
+                      goto Syntax_Error;
+                    }
+                    else
+                      ...
+#endif
+
+                    curY = cf2_stack_popFixed( opStack );
+                    curX = cf2_stack_popFixed( opStack );
+
+                    decoder->flex_state = 0;
+                  }
+                  break;
+
+                } /* end of 2nd switch checking op2 */
+              }
+            }
+          } /* end of 1st switch checking op2 */
+        } /* case cf2_cmdESC */
+
+        break;
+
+      case cf2_cmdHSBW:
+        if ( !font->isT1 )
+          FT_TRACE4(( " unknown op (%d)\n", op1 ));
+        else
+        {
+          CF2_Fixed    lsb_x;
+          PS_Builder*  builder;
+
+
+          FT_TRACE4(( " hsbw" ));
+
+          builder = &decoder->builder;
+
+          builder->advance->x = cf2_stack_popFixed( opStack );
+          builder->advance->y = 0;
+
+          lsb_x = cf2_stack_popFixed( opStack );
+
+          builder->left_bearing->x = ADD_INT32( builder->left_bearing->x,
+                                                lsb_x );
+
+          haveWidth = TRUE;
+
+          /* 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 )
+            goto exit;
+
+          if ( initial_map_ready )
+            curX = ADD_INT32( curX, lsb_x );
+        }
+        break;
+
+      case cf2_cmdENDCHAR:
+        FT_TRACE4(( " endchar\n" ));
+
+        if ( font->isT1 && !initial_map_ready )
+        {
+          FT_TRACE5(( "cf2_interpT2CharString (Type 1 mode): "
+                      "Build initial hintmap, rewinding...\n" ));
+
+          /* trigger initial hintmap build */
+          cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+          initial_map_ready = TRUE;
+
+          /* change hints routine - clear for rewind */
+          cf2_arrstack_clear( &vStemHintArray );
+          cf2_arrstack_clear( &hStemHintArray );
+
+          cf2_hintmask_init( &hintMask, error );
+          hintMask.isValid = FALSE;
+          hintMask.isNew   = TRUE;
+
+          /* rewind charstring */
+          /* some charstrings use endchar from a final subroutine call */
+          /* without returning, detect these and exit to the top level */
+          /* charstring                                                */
+          while ( charstringIndex > 0 )
+          {
+            FT_TRACE4(( " return (leaving level %d)\n", charstringIndex ));
+
+            /* restore position in previous charstring */
+            charstring = (CF2_Buffer)
+                           cf2_arrstack_getPointer(
+                             &subrStack,
+                             (CF2_UInt)--charstringIndex );
+          }
+          charstring->ptr = charstring->start;
+
+          break;
+        }
+
+        if ( cf2_stack_count( opStack ) == 1 ||
+             cf2_stack_count( opStack ) == 5 )
+        {
+          if ( !haveWidth )
+            *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ),
+                                nominalWidthX );
+        }
+
+        /* width is defined or default after this */
+        haveWidth = TRUE;
+
+        if ( decoder->width_only )
+          goto exit;
+
+        /* close path if still open */
+        cf2_glyphpath_closeOpenPath( &glyphPath );
+
+        /* disable seac for CFF2 and Type1        */
+        /* (charstring ending with args on stack) */
+        if ( !font->isCFF2 && !font->isT1 && cf2_stack_count( opStack ) > 1 )
+        {
+          /* must be either 4 or 5 --                       */
+          /* this is a (deprecated) implied `seac' operator */
+
+          CF2_Int        achar;
+          CF2_Int        bchar;
+          CF2_BufferRec  component;
+          CF2_Fixed      dummyWidth;   /* ignore component width */
+          FT_Error       error2;
+
+
+          if ( doingSeac )
+          {
+            lastError = FT_THROW( Invalid_Glyph_Format );
+            goto exit;      /* nested seac */
+          }
+
+          achar = cf2_stack_popInt( opStack );
+          bchar = cf2_stack_popInt( opStack );
+
+          curY = cf2_stack_popFixed( opStack );
+          curX = cf2_stack_popFixed( opStack );
+
+          error2 = cf2_getSeacComponent( decoder, achar, &component );
+          if ( error2 )
+          {
+            lastError = error2;      /* pass FreeType error through */
+            goto exit;
+          }
+          cf2_interpT2CharString( font,
+                                  &component,
+                                  callbacks,
+                                  translation,
+                                  TRUE,
+                                  curX,
+                                  curY,
+                                  &dummyWidth );
+          cf2_freeSeacComponent( decoder, &component );
+
+          error2 = cf2_getSeacComponent( decoder, bchar, &component );
+          if ( error2 )
+          {
+            lastError = error2;      /* pass FreeType error through */
+            goto exit;
+          }
+          cf2_interpT2CharString( font,
+                                  &component,
+                                  callbacks,
+                                  translation,
+                                  TRUE,
+                                  0,
+                                  0,
+                                  &dummyWidth );
+          cf2_freeSeacComponent( decoder, &component );
+        }
+        goto exit;
+
+      case cf2_cmdCNTRMASK:
+      case cf2_cmdHINTMASK:
+        /* the final \n in the tracing message gets added in      */
+        /* `cf2_hintmask_read' (which also traces the mask bytes) */
+        FT_TRACE4(( op1 == cf2_cmdCNTRMASK ? " cntrmask" : " hintmask" ));
+
+        /* never add hints after the mask is computed */
+        if ( cf2_stack_count( opStack ) > 1    &&
+             cf2_hintmask_isValid( &hintMask ) )
+        {
+          FT_TRACE4(( "cf2_interpT2CharString: invalid hint mask\n" ));
+          break;
+        }
+
+        /* if there are arguments on the stack, there this is an */
+        /* implied cf2_cmdVSTEMHM                                */
+        cf2_doStems( font,
+                     opStack,
+                     &vStemHintArray,
+                     width,
+                     &haveWidth,
+                     0 );
+
+        if ( decoder->width_only )
+          goto exit;
+
+        if ( op1 == cf2_cmdHINTMASK )
+        {
+          /* consume the hint mask bytes which follow the operator */
+          cf2_hintmask_read( &hintMask,
+                             charstring,
+                             cf2_arrstack_size( &hStemHintArray ) +
+                               cf2_arrstack_size( &vStemHintArray ) );
+        }
+        else
+        {
+          /*
+           * Consume the counter mask bytes which follow the operator:
+           * Build a temporary hint map, just to place and lock those
+           * stems participating in the counter mask.  These are most
+           * likely the dominant hstems, and are grouped together in a
+           * few counter groups, not necessarily in correspondence
+           * with the hint groups.  This reduces the chances of
+           * conflicts between hstems that are initially placed in
+           * separate hint groups and then brought together.  The
+           * positions are copied back to `hStemHintArray', so we can
+           * discard `counterMask' and `counterHintMap'.
+           *
+           */
+          CF2_HintMapRec   counterHintMap;
+          CF2_HintMaskRec  counterMask;
+
+
+          cf2_hintmap_init( &counterHintMap,
+                            font,
+                            &glyphPath.initialHintMap,
+                            &glyphPath.hintMoves,
+                            scaleY );
+          cf2_hintmask_init( &counterMask, error );
+
+          cf2_hintmask_read( &counterMask,
+                             charstring,
+                             cf2_arrstack_size( &hStemHintArray ) +
+                               cf2_arrstack_size( &vStemHintArray ) );
+          cf2_hintmap_build( &counterHintMap,
+                             &hStemHintArray,
+                             &vStemHintArray,
+                             &counterMask,
+                             0,
+                             FALSE );
+        }
+        break;
+
+      case cf2_cmdRMOVETO:
+        FT_TRACE4(( " rmoveto\n" ));
+
+        if ( font->isT1 && !decoder->flex_state && !haveWidth )
+          FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                     " No width. Use hsbw/sbw as first op\n" ));
+
+        if ( cf2_stack_count( opStack ) > 2 && !haveWidth )
+          *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ),
+                              nominalWidthX );
+
+        /* width is defined or default after this */
+        haveWidth = TRUE;
+
+        if ( decoder->width_only )
+          goto exit;
+
+        curY = ADD_INT32( curY, cf2_stack_popFixed( opStack ) );
+        curX = ADD_INT32( curX, cf2_stack_popFixed( opStack ) );
+
+        if ( !decoder->flex_state )
+          cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+        break;
+
+      case cf2_cmdHMOVETO:
+        FT_TRACE4(( " hmoveto\n" ));
+
+        if ( font->isT1 && !decoder->flex_state && !haveWidth )
+          FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                     " No width. Use hsbw/sbw as first op\n" ));
+
+        if ( cf2_stack_count( opStack ) > 1 && !haveWidth )
+          *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ),
+                              nominalWidthX );
+
+        /* width is defined or default after this */
+        haveWidth = TRUE;
+
+        if ( decoder->width_only )
+          goto exit;
+
+        curX = ADD_INT32( curX, cf2_stack_popFixed( opStack ) );
+
+        cf2_glyphpath_moveTo( &glyphPath, curX, curY );
+
+        break;
+
+      case cf2_cmdRLINECURVE:
+        {
+          CF2_UInt  count = cf2_stack_count( opStack );
+          CF2_UInt  idx   = 0;
+
+
+          FT_TRACE4(( " rlinecurve\n" ));
+
+          while ( idx + 6 < count )
+          {
+            curX = ADD_INT32( curX, cf2_stack_getReal( opStack,
+                                                       idx + 0 ) );
+            curY = ADD_INT32( curY, cf2_stack_getReal( opStack,
+                                                       idx + 1 ) );
+
+            cf2_glyphpath_lineTo( &glyphPath, curX, curY );
+            idx += 2;
+          }
+
+          while ( idx < count )
+          {
+            CF2_Fixed  x1, y1, x2, y2, x3, y3;
+
+
+            x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX );
+            y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), curY );
+            x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), x1 );
+            y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y1 );
+            x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), x2 );
+            y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 5 ), y2 );
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX  = x3;
+            curY  = y3;
+            idx  += 6;
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdVVCURVETO:
+        {
+          CF2_UInt  count, count1 = cf2_stack_count( opStack );
+          CF2_UInt  idx = 0;
+
+
+          /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */
+          /* we enforce it by clearing the second bit           */
+          /* (and sorting the stack indexing to suit)           */
+          count = count1 & ~2U;
+          idx  += count1 - count;
+
+          FT_TRACE4(( " vvcurveto\n" ));
+
+          while ( idx < count )
+          {
+            CF2_Fixed  x1, y1, x2, y2, x3, y3;
+
+
+            if ( ( count - idx ) & 1 )
+            {
+              x1 = ADD_INT32( cf2_stack_getReal( opStack, idx ), curX );
+
+              idx++;
+            }
+            else
+              x1 = curX;
+
+            y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curY );
+            x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 );
+            y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 );
+            x3 = x2;
+            y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y2 );
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX  = x3;
+            curY  = y3;
+            idx  += 4;
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdHHCURVETO:
+        {
+          CF2_UInt  count, count1 = cf2_stack_count( opStack );
+          CF2_UInt  idx = 0;
+
+
+          /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */
+          /* we enforce it by clearing the second bit           */
+          /* (and sorting the stack indexing to suit)           */
+          count = count1 & ~2U;
+          idx  += count1 - count;
+
+          FT_TRACE4(( " hhcurveto\n" ));
+
+          while ( idx < count )
+          {
+            CF2_Fixed  x1, y1, x2, y2, x3, y3;
+
+
+            if ( ( count - idx ) & 1 )
+            {
+              y1 = ADD_INT32( cf2_stack_getReal( opStack, idx ), curY );
+
+              idx++;
+            }
+            else
+              y1 = curY;
+
+            x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX );
+            x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 );
+            y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 );
+            x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), x2 );
+            y3 = y2;
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX  = x3;
+            curY  = y3;
+            idx  += 4;
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue; /* no need to clear stack again */
+
+      case cf2_cmdVHCURVETO:
+      case cf2_cmdHVCURVETO:
+        {
+          CF2_UInt  count, count1 = cf2_stack_count( opStack );
+          CF2_UInt  idx = 0;
+
+          FT_Bool  alternate = FT_BOOL( op1 == cf2_cmdHVCURVETO );
+
+
+          /* if `cf2_stack_count' isn't of the form 8n, 8n+1, */
+          /* 8n+4, or 8n+5, we enforce it by clearing the     */
+          /* second bit                                       */
+          /* (and sorting the stack indexing to suit)         */
+          count = count1 & ~2U;
+          idx  += count1 - count;
+
+          FT_TRACE4(( alternate ? " hvcurveto\n" : " vhcurveto\n" ));
+
+          while ( idx < count )
+          {
+            CF2_Fixed x1, x2, x3, y1, y2, y3;
+
+
+            if ( alternate )
+            {
+              x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX );
+              y1 = curY;
+              x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 );
+              y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 );
+              y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y2 );
+
+              if ( count - idx == 5 )
+              {
+                x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), x2 );
+
+                idx++;
+              }
+              else
+                x3 = x2;
+
+              alternate = FALSE;
+            }
+            else
+            {
+              x1 = curX;
+              y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curY );
+              x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 );
+              y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 );
+              x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), x2 );
+
+              if ( count - idx == 5 )
+              {
+                y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), y2 );
+
+                idx++;
+              }
+              else
+                y3 = y2;
+
+              alternate = TRUE;
+            }
+
+            cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 );
+
+            curX  = x3;
+            curY  = y3;
+            idx  += 4;
+          }
+
+          cf2_stack_clear( opStack );
+        }
+        continue;     /* no need to clear stack again */
+
+      case cf2_cmdEXTENDEDNMBR:
+        {
+          CF2_Int  v;
+
+          CF2_Int  byte1 = cf2_buf_readByte( charstring );
+          CF2_Int  byte2 = cf2_buf_readByte( charstring );
+
+
+          v = (FT_Short)( ( byte1 << 8 ) |
+                            byte2        );
+
+          FT_TRACE4(( " %d", v ));
+
+          cf2_stack_pushInt( opStack, v );
+        }
+        continue;
+
+      default:
+        /* numbers */
+        {
+          if ( /* op1 >= 32 && */ op1 <= 246 )
+          {
+            CF2_Int  v;
+
+
+            v = op1 - 139;
+
+            FT_TRACE4(( " %d", v ));
+
+            /* -107 .. 107 */
+            cf2_stack_pushInt( opStack, v );
+          }
+
+          else if ( /* op1 >= 247 && */ op1 <= 250 )
+          {
+            CF2_Int  v;
+
+
+            v  = op1;
+            v -= 247;
+            v *= 256;
+            v += cf2_buf_readByte( charstring );
+            v += 108;
+
+            FT_TRACE4(( " %d", v ));
+
+            /* 108 .. 1131 */
+            cf2_stack_pushInt( opStack, v );
+          }
+
+          else if ( /* op1 >= 251 && */ op1 <= 254 )
+          {
+            CF2_Int  v;
+
+
+            v  = op1;
+            v -= 251;
+            v *= 256;
+            v += cf2_buf_readByte( charstring );
+            v  = -v - 108;
+
+            FT_TRACE4(( " %d", v ));
+
+            /* -1131 .. -108 */
+            cf2_stack_pushInt( opStack, v );
+          }
+
+          else /* op1 == 255 */
+          {
+            CF2_Fixed  v;
+
+            FT_UInt32  byte1 = (FT_UInt32)cf2_buf_readByte( charstring );
+            FT_UInt32  byte2 = (FT_UInt32)cf2_buf_readByte( charstring );
+            FT_UInt32  byte3 = (FT_UInt32)cf2_buf_readByte( charstring );
+            FT_UInt32  byte4 = (FT_UInt32)cf2_buf_readByte( charstring );
+
+
+            v = (CF2_Fixed)( ( byte1 << 24 ) |
+                             ( byte2 << 16 ) |
+                             ( byte3 <<  8 ) |
+                               byte4         );
+
+            /*
+             * For Type 1:
+             *
+             * 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.
+             *
+             * <large> <num> <num>+ div is not checked but should not be
+             * allowed as the large value remains untouched.
+             *
+             */
+            if ( font->isT1 )
+            {
+              if ( v > 32000 || v < -32000 )
+              {
+                if ( large_int )
+                  FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):"
+                             " no `div' after large integer\n" ));
+                else
+                  large_int = TRUE;
+              }
+
+              FT_TRACE4(( " %d", v ));
+
+              cf2_stack_pushInt( opStack, (CF2_Int)v );
+            }
+            else
+            {
+              FT_TRACE4(( " %.5fF", v / 65536.0 ));
+
+              cf2_stack_pushFixed( opStack, v );
+            }
+          }
+        }
+        continue;   /* don't clear stack */
+
+      } /* end of switch statement checking `op1' */
+
+      cf2_stack_clear( opStack );
+
+    } /* end of main interpreter loop */
+
+    /* we get here if the charstring ends without cf2_cmdENDCHAR */
+    FT_TRACE4(( "cf2_interpT2CharString:"
+                "  charstring ends without ENDCHAR\n" ));
+
+  exit:
+    /* check whether last error seen is also the first one */
+    cf2_setError( error, lastError );
+
+    if ( *error )
+      FT_TRACE4(( "charstring error %d\n", *error ));
+
+    /* free resources from objects we've used */
+    cf2_glyphpath_finalize( &glyphPath );
+    cf2_arrstack_finalize( &vStemHintArray );
+    cf2_arrstack_finalize( &hStemHintArray );
+    cf2_arrstack_finalize( &subrStack );
+    cf2_stack_free( opStack );
+
+    FT_TRACE4(( "\n" ));
+
+    return;
+  }
+
+
+/* END */
similarity index 95%
rename from src/cff/cf2intrp.h
rename to src/psaux/psintrp.h
index ec030e8..4790aaa 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2font.h                                                              */
+/*  psintrp.h                                                              */
 /*                                                                         */
 /*    Adobe's CFF Interpreter (specification).                             */
 /*                                                                         */
 /***************************************************************************/
 
 
-#ifndef CF2INTRP_H_
-#define CF2INTRP_H_
+#ifndef PSINTRP_H_
+#define PSINTRP_H_
 
 
-#include "cf2ft.h"
-#include "cf2hints.h"
+#include "psft.h"
+#include "pshints.h"
 
 
 FT_BEGIN_HEADER
@@ -77,7 +77,7 @@ FT_BEGIN_HEADER
 FT_END_HEADER
 
 
-#endif /* CF2INTRP_H_ */
+#endif /* PSINTRP_H_ */
 
 
 /* END */
index f04edea..f54bc7e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auxiliary functions for PostScript fonts (body).                     */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 #include FT_INTERNAL_POSTSCRIPT_AUX_H
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_CALC_H
+#include FT_DRIVER_H
 
 #include "psobjs.h"
 #include "psconv.h"
 
 #include "psauxerr.h"
+#include "psauxmod.h"
 
 
   /*************************************************************************/
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
+  /*****                           CFF BUILDER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <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.                              */
+  /*                                                                       */
+  FT_LOCAL_DEF( 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 = NULL;
+      builder->hints_funcs   = NULL;
+
+      if ( hinting && size )
+      {
+        FT_Size       ftsize   = FT_SIZE( size );
+        CFF_Internal  internal = (CFF_Internal)ftsize->internal->module_data;
+
+        if ( 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;
+
+    builder->funcs = cff_builder_funcs;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <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.             */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  cff_builder_done( CFF_Builder*  builder )
+  {
+    CFF_GlyphSlot  glyph = builder->glyph;
+
+
+    if ( glyph )
+      glyph->root.outline = *builder->base;
+  }
+
+
+  /* check that there is enough space for `count' more points */
+  FT_LOCAL_DEF( FT_Error )
+  cff_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 */
+  FT_LOCAL_DEF( 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;
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+      PS_Driver  driver   = (PS_Driver)FT_FACE_DRIVER( builder->face );
+
+
+      if ( driver->hinting_engine == FT_HINTING_FREETYPE )
+      {
+        point->x = x >> 16;
+        point->y = y >> 16;
+      }
+      else
+#endif
+      {
+        /* cf2_decoder_parse_charstrings uses 16.16 coordinates */
+        point->x = x >> 10;
+        point->y = y >> 10;
+      }
+      *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 )
+  cff_builder_add_point1( CFF_Builder*  builder,
+                          FT_Pos        x,
+                          FT_Pos        y )
+  {
+    FT_Error  error;
+
+
+    error = cff_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 */
+  FT_LOCAL_DEF( 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 FT_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 )
+  cff_builder_start_point( CFF_Builder*  builder,
+                           FT_Pos        x,
+                           FT_Pos        y )
+  {
+    FT_Error  error = FT_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 */
+  FT_LOCAL_DEF( 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 );
+    }
+  }
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            PS BUILDER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ps_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 )
+  ps_builder_init( PS_Builder*  ps_builder,
+                   void*        builder,
+                   FT_Bool      is_t1 )
+  {
+    FT_ZERO( ps_builder );
+
+    if ( is_t1 )
+    {
+      T1_Builder  t1builder = (T1_Builder)builder;
+
+
+      ps_builder->memory  = t1builder->memory;
+      ps_builder->face    = (FT_Face)t1builder->face;
+      ps_builder->glyph   = (CFF_GlyphSlot)t1builder->glyph;
+      ps_builder->loader  = t1builder->loader;
+      ps_builder->base    = t1builder->base;
+      ps_builder->current = t1builder->current;
+
+      ps_builder->pos_x = &t1builder->pos_x;
+      ps_builder->pos_y = &t1builder->pos_y;
+
+      ps_builder->left_bearing = &t1builder->left_bearing;
+      ps_builder->advance      = &t1builder->advance;
+
+      ps_builder->bbox        = &t1builder->bbox;
+      ps_builder->path_begun  = 0;
+      ps_builder->load_points = t1builder->load_points;
+      ps_builder->no_recurse  = t1builder->no_recurse;
+
+      ps_builder->metrics_only = t1builder->metrics_only;
+    }
+    else
+    {
+      CFF_Builder*  cffbuilder = (CFF_Builder*)builder;
+
+
+      ps_builder->memory  = cffbuilder->memory;
+      ps_builder->face    = (FT_Face)cffbuilder->face;
+      ps_builder->glyph   = cffbuilder->glyph;
+      ps_builder->loader  = cffbuilder->loader;
+      ps_builder->base    = cffbuilder->base;
+      ps_builder->current = cffbuilder->current;
+
+      ps_builder->pos_x = &cffbuilder->pos_x;
+      ps_builder->pos_y = &cffbuilder->pos_y;
+
+      ps_builder->left_bearing = &cffbuilder->left_bearing;
+      ps_builder->advance      = &cffbuilder->advance;
+
+      ps_builder->bbox        = &cffbuilder->bbox;
+      ps_builder->path_begun  = cffbuilder->path_begun;
+      ps_builder->load_points = cffbuilder->load_points;
+      ps_builder->no_recurse  = cffbuilder->no_recurse;
+
+      ps_builder->metrics_only = cffbuilder->metrics_only;
+    }
+
+    ps_builder->is_t1 = is_t1;
+    ps_builder->funcs = ps_builder_funcs;
+  }
+
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ps_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 )
+  ps_builder_done( PS_Builder*  builder )
+  {
+    CFF_GlyphSlot  glyph = builder->glyph;
+
+
+    if ( glyph )
+      glyph->root.outline = *builder->base;
+  }
+
+
+  /* check that there is enough space for `count' more points */
+  FT_LOCAL_DEF( FT_Error )
+  ps_builder_check_points( PS_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 )
+  ps_builder_add_point( PS_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;
+
+#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
+      PS_Driver  driver   = (PS_Driver)FT_FACE_DRIVER( builder->face );
+
+
+      if ( !builder->is_t1 &&
+           driver->hinting_engine == FT_HINTING_FREETYPE )
+      {
+        point->x = x >> 16;
+        point->y = y >> 16;
+      }
+      else
+#endif
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+#ifndef CFF_CONFIG_OPTION_OLD_ENGINE
+      PS_Driver  driver   = (PS_Driver)FT_FACE_DRIVER( builder->face );
+#endif
+      if ( builder->is_t1 &&
+           driver->hinting_engine == FT_HINTING_FREETYPE )
+      {
+        point->x = FIXED_TO_INT( x );
+        point->y = FIXED_TO_INT( y );
+      }
+      else
+#endif
+      {
+        /* cf2_decoder_parse_charstrings uses 16.16 coordinates */
+        point->x = x >> 10;
+        point->y = y >> 10;
+      }
+      *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 )
+  ps_builder_add_point1( PS_Builder*  builder,
+                         FT_Pos       x,
+                         FT_Pos       y )
+  {
+    FT_Error  error;
+
+
+    error = ps_builder_check_points( builder, 1 );
+    if ( !error )
+      ps_builder_add_point( builder, x, y, 1 );
+
+    return error;
+  }
+
+
+  /* check space for a new contour, then add it */
+  FT_LOCAL_DEF( FT_Error )
+  ps_builder_add_contour( PS_Builder*  builder )
+  {
+    FT_Outline*  outline = builder->current;
+    FT_Error     error;
+
+
+    /* this might happen in invalid fonts */
+    if ( !outline )
+    {
+      FT_ERROR(( "ps_builder_add_contour: no outline to add points to\n" ));
+      return FT_THROW( Invalid_File_Format );
+    }
+
+    if ( !builder->load_points )
+    {
+      outline->n_contours++;
+      return FT_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 )
+  ps_builder_start_point( PS_Builder*  builder,
+                          FT_Pos       x,
+                          FT_Pos       y )
+  {
+    FT_Error  error = FT_Err_Ok;
+
+
+    /* test whether we are building a new contour */
+    if ( !builder->path_begun )
+    {
+      builder->path_begun = 1;
+      error = ps_builder_add_contour( builder );
+      if ( !error )
+        error = ps_builder_add_point1( builder, x, y );
+    }
+
+    return error;
+  }
+
+
+  /* close the current contour */
+  FT_LOCAL_DEF( void )
+  ps_builder_close_contour( PS_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;
+
+    /* in malformed fonts it can happen that a contour was started */
+    /* but no points were added                                    */
+    if ( outline->n_contours && first == outline->n_points )
+    {
+      outline->n_contours--;
+      return;
+    }
+
+    /* 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                              *****/
   /*****                                                               *****/
   /*************************************************************************/
   /*************************************************************************/
 
+
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    ps_decoder_init                                                    */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Creates a wrapper decoder for use in the combined                  */
+  /*    Type 1 / CFF interpreter.                                          */
+  /*                                                                       */
+  /* <InOut>                                                               */
+  /*    ps_decoder :: A pointer to the decoder to initialize.              */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    decoder    :: A pointer to the original decoder.                   */
+  /*                                                                       */
+  /*    is_t1      :: Flag indicating Type 1 or CFF                        */
+  /*                                                                       */
+  FT_LOCAL_DEF( void )
+  ps_decoder_init( PS_Decoder*  ps_decoder,
+                   void*        decoder,
+                   FT_Bool      is_t1 )
+  {
+    FT_ZERO( ps_decoder );
+
+    if ( is_t1 )
+    {
+      T1_Decoder  t1_decoder = (T1_Decoder)decoder;
+
+
+      ps_builder_init( &ps_decoder->builder,
+                       &t1_decoder->builder,
+                       is_t1 );
+
+      ps_decoder->cf2_instance = &t1_decoder->cf2_instance;
+      ps_decoder->psnames      = t1_decoder->psnames;
+
+      ps_decoder->num_glyphs  = t1_decoder->num_glyphs;
+      ps_decoder->glyph_names = t1_decoder->glyph_names;
+      ps_decoder->hint_mode   = t1_decoder->hint_mode;
+      ps_decoder->blend       = t1_decoder->blend;
+
+      ps_decoder->num_locals  = (FT_UInt)t1_decoder->num_subrs;
+      ps_decoder->locals      = t1_decoder->subrs;
+      ps_decoder->locals_len  = t1_decoder->subrs_len;
+      ps_decoder->locals_hash = t1_decoder->subrs_hash;
+
+      ps_decoder->buildchar     = t1_decoder->buildchar;
+      ps_decoder->len_buildchar = t1_decoder->len_buildchar;
+
+      ps_decoder->lenIV = t1_decoder->lenIV;
+    }
+    else
+    {
+      CFF_Decoder*  cff_decoder = (CFF_Decoder*)decoder;
+
+
+      ps_builder_init( &ps_decoder->builder,
+                       &cff_decoder->builder,
+                       is_t1 );
+
+      ps_decoder->cff             = cff_decoder->cff;
+      ps_decoder->cf2_instance    = &cff_decoder->cff->cf2_instance;
+      ps_decoder->current_subfont = cff_decoder->current_subfont;
+
+      ps_decoder->num_globals  = cff_decoder->num_globals;
+      ps_decoder->globals      = cff_decoder->globals;
+      ps_decoder->globals_bias = cff_decoder->globals_bias;
+      ps_decoder->num_locals   = cff_decoder->num_locals;
+      ps_decoder->locals       = cff_decoder->locals;
+      ps_decoder->locals_bias  = cff_decoder->locals_bias;
+
+      ps_decoder->glyph_width   = &cff_decoder->glyph_width;
+      ps_decoder->width_only    = cff_decoder->width_only;
+
+      ps_decoder->hint_mode = cff_decoder->hint_mode;
+
+      ps_decoder->get_glyph_callback  = cff_decoder->get_glyph_callback;
+      ps_decoder->free_glyph_callback = cff_decoder->free_glyph_callback;
+    }
+  }
+
+
+  /* Synthesize a SubFont object for Type 1 fonts, for use in the  */
+  /* new interpreter to access Private dict data.                  */
+  FT_LOCAL_DEF( void )
+  t1_make_subfont( FT_Face      face,
+                   PS_Private   priv,
+                   CFF_SubFont  subfont )
+  {
+    CFF_Private  cpriv = &subfont->private_dict;
+    FT_UInt      n, count;
+
+
+    FT_ZERO( subfont );
+    FT_ZERO( cpriv );
+
+    count = cpriv->num_blue_values = priv->num_blue_values;
+    for ( n = 0; n < count; n++ )
+      cpriv->blue_values[n] = (FT_Pos)priv->blue_values[n];
+
+    count = cpriv->num_other_blues = priv->num_other_blues;
+    for ( n = 0; n < count; n++ )
+      cpriv->other_blues[n] = (FT_Pos)priv->other_blues[n];
+
+    count = cpriv->num_family_blues = priv->num_family_blues;
+    for ( n = 0; n < count; n++ )
+      cpriv->family_blues[n] = (FT_Pos)priv->family_blues[n];
+
+    count = cpriv->num_family_other_blues = priv->num_family_other_blues;
+    for ( n = 0; n < count; n++ )
+      cpriv->family_other_blues[n] = (FT_Pos)priv->family_other_blues[n];
+
+    cpriv->blue_scale = priv->blue_scale;
+    cpriv->blue_shift = (FT_Pos)priv->blue_shift;
+    cpriv->blue_fuzz  = (FT_Pos)priv->blue_fuzz;
+
+    cpriv->standard_width  = (FT_Pos)priv->standard_width[0];
+    cpriv->standard_height = (FT_Pos)priv->standard_height[0];
+
+    count = cpriv->num_snap_widths = priv->num_snap_widths;
+    for ( n = 0; n < count; n++ )
+      cpriv->snap_widths[n] = (FT_Pos)priv->snap_widths[n];
+
+    count = cpriv->num_snap_heights = priv->num_snap_heights;
+    for ( n = 0; n < count; n++ )
+      cpriv->snap_heights[n] = (FT_Pos)priv->snap_heights[n];
+
+    cpriv->force_bold       = priv->force_bold;
+    cpriv->lenIV            = priv->lenIV;
+    cpriv->language_group   = priv->language_group;
+    cpriv->expansion_factor = priv->expansion_factor;
+
+    cpriv->subfont = subfont;
+
+
+    /* Initialize the random number generator. */
+    if ( face->internal->random_seed != -1 )
+    {
+      /* If we have a face-specific seed, use it.    */
+      /* If non-zero, update it to a positive value. */
+      subfont->random = (FT_UInt32)face->internal->random_seed;
+      if ( face->internal->random_seed )
+      {
+        do
+        {
+          face->internal->random_seed = (FT_Int32)cff_random(
+            (FT_UInt32)face->internal->random_seed );
+
+        } while ( face->internal->random_seed < 0 );
+      }
+    }
+    if ( !subfont->random )
+    {
+      FT_UInt32  seed;
+
+
+      /* compute random seed from some memory addresses */
+      seed = (FT_UInt32)( (FT_Offset)(char*)&seed    ^
+                          (FT_Offset)(char*)&face    ^
+                          (FT_Offset)(char*)&subfont );
+      seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 );
+      if ( seed == 0 )
+        seed = 0x7384;
+
+      subfont->random = seed;
+    }
+  }
+
+
   FT_LOCAL_DEF( void )
   t1_decrypt( FT_Byte*   buffer,
               FT_Offset  length,
   }
 
 
+  FT_LOCAL_DEF( FT_UInt32 )
+  cff_random( FT_UInt32  r )
+  {
+    /* a 32bit version of the `xorshift' algorithm */
+    r ^= r << 13;
+    r ^= r >> 17;
+    r ^= r << 5;
+
+    return r;
+  }
+
+
 /* END */
index 202e5b2..8e0fe5f 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Auxiliary functions for PostScript fonts (specification).            */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,6 +22,7 @@
 
 #include <ft2build.h>
 #include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_CFF_OBJECTS_TYPES_H
 
 
 FT_BEGIN_HEADER
@@ -193,17 +194,117 @@ FT_BEGIN_HEADER
   /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
+  /*****                           CFF BUILDER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  cff_builder_init( CFF_Builder*   builder,
+                    TT_Face        face,
+                    CFF_Size       size,
+                    CFF_GlyphSlot  glyph,
+                    FT_Bool        hinting );
+
+  FT_LOCAL( void )
+  cff_builder_done( CFF_Builder*  builder );
+
+  FT_LOCAL( FT_Error )
+  cff_check_points( CFF_Builder*  builder,
+                    FT_Int        count );
+
+  FT_LOCAL( void )
+  cff_builder_add_point( CFF_Builder*  builder,
+                         FT_Pos        x,
+                         FT_Pos        y,
+                         FT_Byte       flag );
+  FT_LOCAL( FT_Error )
+  cff_builder_add_point1( CFF_Builder*  builder,
+                          FT_Pos        x,
+                          FT_Pos        y );
+  FT_LOCAL( FT_Error )
+  cff_builder_start_point( CFF_Builder*  builder,
+                           FT_Pos        x,
+                           FT_Pos        y );
+  FT_LOCAL( void )
+  cff_builder_close_contour( CFF_Builder*  builder );
+
+  FT_LOCAL( FT_Error )
+  cff_builder_add_contour( CFF_Builder*  builder );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                            PS BUILDER                         *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  FT_LOCAL( void )
+  ps_builder_init( PS_Builder*  ps_builder,
+                   void*        builder,
+                   FT_Bool      is_t1 );
+
+
+  FT_LOCAL( void )
+  ps_builder_done( PS_Builder*  builder );
+
+  FT_LOCAL( FT_Error )
+  ps_builder_check_points( PS_Builder*  builder,
+                           FT_Int       count );
+
+  FT_LOCAL( void )
+  ps_builder_add_point( PS_Builder*  builder,
+                        FT_Pos       x,
+                        FT_Pos       y,
+                        FT_Byte      flag );
+
+  FT_LOCAL( FT_Error )
+  ps_builder_add_point1( PS_Builder*  builder,
+                         FT_Pos       x,
+                         FT_Pos       y );
+
+  FT_LOCAL( FT_Error )
+  ps_builder_add_contour( PS_Builder*  builder );
+
+  FT_LOCAL( FT_Error )
+  ps_builder_start_point( PS_Builder*  builder,
+                          FT_Pos       x,
+                          FT_Pos       y );
+
+  FT_LOCAL( void )
+  ps_builder_close_contour( PS_Builder*  builder );
+
+
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
   /*****                            OTHER                              *****/
   /*****                                                               *****/
   /*************************************************************************/
   /*************************************************************************/
 
   FT_LOCAL( void )
+  ps_decoder_init( PS_Decoder*  ps_decoder,
+                   void*        decoder,
+                   FT_Bool      is_t1 );
+
+  FT_LOCAL( void )
+  t1_make_subfont( FT_Face      face,
+                   PS_Private   priv,
+                   CFF_SubFont  subfont );
+
+  FT_LOCAL( void )
   t1_decrypt( FT_Byte*   buffer,
               FT_Offset  length,
               FT_UShort  seed );
 
 
+  FT_LOCAL( FT_UInt32 )
+  cff_random( FT_UInt32  r );
+
+
 FT_END_HEADER
 
 #endif /* PSOBJS_H_ */
similarity index 97%
rename from src/cff/cf2read.c
rename to src/psaux/psread.c
index 2b429e3..719863c 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2read.c                                                              */
+/*  psread.c                                                               */
 /*                                                                         */
 /*    Adobe's code for stream handling (body).                             */
 /*                                                                         */
 /***************************************************************************/
 
 
-#include "cf2ft.h"
+#include "psft.h"
 #include FT_INTERNAL_DEBUG_H
 
-#include "cf2glue.h"
+#include "psglue.h"
 
-#include "cf2error.h"
+#include "pserror.h"
 
 
   /* Define CF2_IO_FAIL as 1 to enable random errors and random */
similarity index 96%
rename from src/cff/cf2read.h
rename to src/psaux/psread.h
index b0b0db8..464b29b 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2read.h                                                              */
+/*  psread.h                                                               */
 /*                                                                         */
 /*    Adobe's code for stream handling (specification).                    */
 /*                                                                         */
@@ -36,8 +36,8 @@
 /***************************************************************************/
 
 
-#ifndef CF2READ_H_
-#define CF2READ_H_
+#ifndef PSREAD_H_
+#define PSREAD_H_
 
 
 FT_BEGIN_HEADER
@@ -62,7 +62,7 @@ FT_BEGIN_HEADER
 FT_END_HEADER
 
 
-#endif /* CF2READ_H_ */
+#endif /* PSREAD_H_ */
 
 
 /* END */
similarity index 98%
rename from src/cff/cf2stack.c
rename to src/psaux/psstack.c
index 12a026d..69d0633 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2stack.c                                                             */
+/*  psstack.c                                                              */
 /*                                                                         */
 /*    Adobe's code for emulating a CFF stack (body).                       */
 /*                                                                         */
 /***************************************************************************/
 
 
-#include "cf2ft.h"
+#include "psft.h"
 #include FT_INTERNAL_DEBUG_H
 
-#include "cf2glue.h"
-#include "cf2font.h"
-#include "cf2stack.h"
+#include "psglue.h"
+#include "psfont.h"
+#include "psstack.h"
 
-#include "cf2error.h"
+#include "pserror.h"
 
 
   /* Allocate and initialize an instance of CF2_Stack.       */
similarity index 97%
rename from src/cff/cf2stack.h
rename to src/psaux/psstack.h
index ef08eef..38f7b41 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2stack.h                                                             */
+/*  psstack.h                                                              */
 /*                                                                         */
 /*    Adobe's code for emulating a CFF stack (specification).              */
 /*                                                                         */
@@ -36,8 +36,8 @@
 /***************************************************************************/
 
 
-#ifndef CF2STACK_H_
-#define CF2STACK_H_
+#ifndef PSSTACK_H_
+#define PSSTACK_H_
 
 
 FT_BEGIN_HEADER
@@ -115,7 +115,7 @@ FT_BEGIN_HEADER
 FT_END_HEADER
 
 
-#endif /* CF2STACK_H_ */
+#endif /* PSSTACK_H_ */
 
 
 /* END */
similarity index 96%
rename from src/cff/cf2types.h
rename to src/psaux/pstypes.h
index 5b7e123..dfbaa3d 100644 (file)
@@ -1,6 +1,6 @@
 /***************************************************************************/
 /*                                                                         */
-/*  cf2types.h                                                             */
+/*  pstypes.h                                                              */
 /*                                                                         */
 /*    Adobe's code for defining data types (specification only).           */
 /*                                                                         */
@@ -36,8 +36,8 @@
 /***************************************************************************/
 
 
-#ifndef CF2TYPES_H_
-#define CF2TYPES_H_
+#ifndef PSTYPES_H_
+#define PSTYPES_H_
 
 #include <ft2build.h>
 #include FT_FREETYPE_H
@@ -72,7 +72,7 @@ FT_BEGIN_HEADER
 FT_END_HEADER
 
 
-#endif /* CF2TYPES_H_ */
+#endif /* PSTYPES_H_ */
 
 
 /* END */
index 542ae12..a87bfe9 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -33,12 +33,25 @@ PSAUX_DRV_SRC := $(PSAUX_DIR)/psobjs.c   \
                  $(PSAUX_DIR)/t1cmap.c   \
                  $(PSAUX_DIR)/afmparse.c \
                  $(PSAUX_DIR)/psconv.c   \
-                 $(PSAUX_DIR)/psauxmod.c
+                 $(PSAUX_DIR)/psauxmod.c \
+                 $(PSAUX_DIR)/psarrst.c \
+                 $(PSAUX_DIR)/psblues.c \
+                 $(PSAUX_DIR)/pserror.c \
+                 $(PSAUX_DIR)/psfont.c  \
+                 $(PSAUX_DIR)/psft.c    \
+                 $(PSAUX_DIR)/pshints.c \
+                 $(PSAUX_DIR)/psintrp.c \
+                 $(PSAUX_DIR)/psread.c  \
+                 $(PSAUX_DIR)/psstack.c \
+                 $(PSAUX_DIR)/cffdecode.c
 
 # PSAUX driver headers
 #
 PSAUX_DRV_H := $(PSAUX_DRV_SRC:%c=%h)  \
-               $(PSAUX_DIR)/psauxerr.h
+               $(PSAUX_DIR)/psauxerr.h \
+               $(PSAUX_DIR)/psfixed.h \
+               $(PSAUX_DIR)/psglue.h  \
+               $(PSAUX_DIR)/pstypes.h
 
 
 # PSAUX driver object(s)
index 45b713e..112a789 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 character map support (body).                                 */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 7870245..4308e31 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 character map support (specification).                        */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 7dd4513..6ad1456 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PostScript Type 1 decoding routines (body).                          */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
+  /*    t1_lookup_glyph_by_stdcharcode_ps                                  */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Looks up a given glyph by its StandardEncoding charcode.  Used to  */
+  /*    implement the SEAC Type 1 operator in the Adobe engine             */
+  /*                                                                       */
+  /* <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.                                                */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Int )
+  t1_lookup_glyph_by_stdcharcode_ps( PS_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 (FT_Int)n;
+    }
+
+    return -1;
+  }
+
+
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
   /*    t1_lookup_glyph_by_stdcharcode                                     */
   /*                                                                       */
   /* <Description>                                                         */
   }
 
 
+  /* 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 );
+  }
+
+
   /*************************************************************************/
   /*                                                                       */
   /* <Function>                                                            */
 
 
               for ( mm = 1; mm < blend->num_designs; mm++ )
-                tmp += FT_MulFix( *delta++, blend->weight_vector[mm] );
+                tmp = ADD_LONG( tmp,
+                                FT_MulFix( *delta++,
+                                           blend->weight_vector[mm] ) );
 
               *values++ = tmp;
             }
           if ( arg_cnt != 2 )
             goto Unexpected_OtherSubr;
 
-          top[0] += top[1]; /* XXX (over|under)flow */
+          top[0] = ADD_LONG( top[0], top[1] );
 
           known_othersubr_result_cnt = 1;
           break;
           if ( arg_cnt != 2 )
             goto Unexpected_OtherSubr;
 
-          top[0] -= top[1]; /* XXX (over|under)flow */
+          top[0] = SUB_LONG( top[0], top[1] );
 
           known_othersubr_result_cnt = 1;
           break;
 
           builder->parse_state = T1_Parse_Have_Width;
 
-          builder->left_bearing.x += top[0];
-          builder->advance.x       = top[1];
-          builder->advance.y       = 0;
+          builder->left_bearing.x = ADD_LONG( builder->left_bearing.x,
+                                              top[0] );
 
-          orig_x = x = builder->pos_x + top[0];
+          builder->advance.x = top[1];
+          builder->advance.y = 0;
+
+          orig_x = x = ADD_LONG( builder->pos_x, top[0] );
           orig_y = y = builder->pos_y;
 
           FT_UNUSED( orig_y );
 
           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];
+          builder->left_bearing.x = ADD_LONG( builder->left_bearing.x,
+                                              top[0] );
+          builder->left_bearing.y = ADD_LONG( 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];
+          x = ADD_LONG( builder->pos_x, top[0] );
+          y = ADD_LONG( 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   */
           if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) )
             goto Fail;
 
-          x += top[0];
+          x = ADD_LONG( x, top[0] );
           goto Add_Line;
 
         case op_hmoveto:
           FT_TRACE4(( " hmoveto" ));
 
-          x += top[0];
+          x = ADD_LONG( x, top[0] );
+
           if ( !decoder->flex_state )
           {
             if ( builder->parse_state == T1_Parse_Start )
                FT_SET_ERROR( t1_builder_check_points( builder, 3 ) )   )
             goto Fail;
 
-          x += top[0];
+          x = ADD_LONG( x, top[0] );
           t1_builder_add_point( builder, x, y, 0 );
-          x += top[1];
-          y += top[2];
+
+          x = ADD_LONG( x, top[1] );
+          y = ADD_LONG( y, top[2] );
           t1_builder_add_point( builder, x, y, 0 );
-          y += top[3];
+
+          y = ADD_LONG( y, top[3] );
           t1_builder_add_point( builder, x, y, 1 );
           break;
 
           if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) )
             goto Fail;
 
-          x += top[0];
-          y += top[1];
+          x = ADD_LONG( x, top[0] );
+          y = ADD_LONG( y, top[1] );
 
         Add_Line:
           if ( FT_SET_ERROR( t1_builder_add_point1( builder, x, y ) ) )
         case op_rmoveto:
           FT_TRACE4(( " rmoveto" ));
 
-          x += top[0];
-          y += top[1];
+          x = ADD_LONG( x, top[0] );
+          y = ADD_LONG( y, top[1] );
+
           if ( !decoder->flex_state )
           {
             if ( builder->parse_state == T1_Parse_Start )
                FT_SET_ERROR( t1_builder_check_points( builder, 3 ) )   )
             goto Fail;
 
-          x += top[0];
-          y += top[1];
+          x = ADD_LONG( x, top[0] );
+          y = ADD_LONG( y, top[1] );
           t1_builder_add_point( builder, x, y, 0 );
 
-          x += top[2];
-          y += top[3];
+          x = ADD_LONG( x, top[2] );
+          y = ADD_LONG( y, top[3] );
           t1_builder_add_point( builder, x, y, 0 );
 
-          x += top[4];
-          y += top[5];
+          x = ADD_LONG( x, top[4] );
+          y = ADD_LONG( y, top[5] );
           t1_builder_add_point( builder, x, y, 1 );
           break;
 
                FT_SET_ERROR( t1_builder_check_points( builder, 3 ) )   )
             goto Fail;
 
-          y += top[0];
+          y = ADD_LONG( y, top[0] );
           t1_builder_add_point( builder, x, y, 0 );
-          x += top[1];
-          y += top[2];
+
+          x = ADD_LONG( x, top[1] );
+          y = ADD_LONG( y, top[2] );
           t1_builder_add_point( builder, x, y, 0 );
-          x += top[3];
+
+          x = ADD_LONG( x, top[3] );
           t1_builder_add_point( builder, x, y, 1 );
           break;
 
           if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) )
             goto Fail;
 
-          y += top[0];
+          y = ADD_LONG( y, top[0] );
           goto Add_Line;
 
         case op_vmoveto:
           FT_TRACE4(( " vmoveto" ));
 
-          y += top[0];
+          y = ADD_LONG( y, top[0] );
+
           if ( !decoder->flex_state )
           {
             if ( builder->parse_state == T1_Parse_Start )
           /* record vertical hint */
           if ( hinter )
           {
-            top[0] += orig_x;
+            top[0] = ADD_LONG( top[0], orig_x );
             hinter->stem( hinter->hints, 0, top );
           }
           break;
             FT_Pos  dx = orig_x;
 
 
-            top[0] += dx;
-            top[2] += dx;
-            top[4] += dx;
+            top[0] = ADD_LONG( top[0], dx );
+            top[2] = ADD_LONG( top[2], dx );
+            top[4] = ADD_LONG( top[4], dx );
             hinter->stem3( hinter->hints, 0, top );
           }
           break;
     return FT_THROW( Stack_Underflow );
   }
 
+#else /* T1_CONFIG_OPTION_OLD_ENGINE */
 
-  /* parse a single Type 1 glyph */
+  /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    t1_decoder_parse_metrics                                           */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Parses a given Type 1 charstrings program to extract width         */
+  /*                                                                       */
+  /* <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_glyph( T1_Decoder  decoder,
-                          FT_UInt     glyph )
+  t1_decoder_parse_metrics( T1_Decoder  decoder,
+                            FT_Byte*    charstring_base,
+                            FT_UInt     charstring_len )
   {
-    return decoder->parse_callback( decoder, glyph );
+    T1_Decoder_Zone  zone;
+    FT_Byte*         ip;
+    FT_Byte*         limit;
+    T1_Builder       builder = &decoder->builder;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    FT_Bool          bol = TRUE;
+#endif
+
+
+    /* First of all, initialize the decoder */
+    decoder->top  = decoder->stack;
+    decoder->zone = decoder->zones;
+    zone          = decoder->zones;
+
+    builder->parse_state = T1_Parse_Start;
+
+    FT_TRACE4(( "\n"
+                "Start charstring: get width\n" ));
+
+    zone->base           = charstring_base;
+    limit = zone->limit  = charstring_base + charstring_len;
+    ip    = zone->cursor = zone->base;
+
+    /* now, execute loop */
+    while ( ip < limit )
+    {
+      FT_Long*     top   = decoder->top;
+      T1_Operator  op    = op_none;
+      FT_Int32     value = 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:
+      case 3:
+      case 4:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+      case 9:
+      case 10:
+      case 11:
+      case 14:
+      case 15:
+      case 21:
+      case 22:
+      case 30:
+      case 31:
+        goto No_Width;
+
+      case 13:
+        op = op_hsbw;
+        break;
+
+      case 12:
+        if ( ip >= limit )
+        {
+          FT_ERROR(( "t1_decoder_parse_metrics:"
+                     " invalid escape (12+EOF)\n" ));
+          goto Syntax_Error;
+        }
+
+        switch ( *ip++ )
+        {
+        case 7:
+          op = op_sbw;
+          break;
+
+        default:
+          goto No_Width;
+        }
+        break;
+
+      case 255:    /* four bytes integer */
+        if ( ip + 4 > limit )
+        {
+          FT_ERROR(( "t1_decoder_parse_metrics:"
+                     " unexpected EOF in integer\n" ));
+          goto Syntax_Error;
+        }
+
+        value = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) |
+                            ( (FT_UInt32)ip[1] << 16 ) |
+                            ( (FT_UInt32)ip[2] << 8  ) |
+                              (FT_UInt32)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 )
+        {
+          FT_ERROR(( "t1_decoder_parse_metrics:"
+                     " large integer found for width\n" ));
+          goto Syntax_Error;
+        }
+        else
+        {
+          value = (FT_Int32)( (FT_UInt32)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_metrics:"
+                         " unexpected EOF in integer\n" ));
+              goto Syntax_Error;
+            }
+
+            if ( ip[-2] < 251 )
+              value =    ( ( ip[-2] - 247 ) * 256 ) + ip[-1] + 108;
+            else
+              value = -( ( ( ip[-2] - 251 ) * 256 ) + ip[-1] + 108 );
+          }
+
+          value = (FT_Int32)( (FT_UInt32)value << 16 );
+        }
+        else
+        {
+          FT_ERROR(( "t1_decoder_parse_metrics:"
+                     " invalid byte (%d)\n", ip[-1] ));
+          goto Syntax_Error;
+        }
+      }
+
+      /*********************************************************************/
+      /*                                                                   */
+      /*  Push value on stack, or process operator                         */
+      /*                                                                   */
+      /*                                                                   */
+      if ( op == op_none )
+      {
+        if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS )
+        {
+          FT_ERROR(( "t1_decoder_parse_metrics: stack overflow\n" ));
+          goto Syntax_Error;
+        }
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+          FT_TRACE4(( " %d", value / 65536 ));
+#endif
+
+        *top++       = value;
+        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;
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+
+        if ( top - decoder->stack != num_args )
+          FT_TRACE0(( "t1_decoder_parse_metrics:"
+                      " too much operands on the stack"
+                      " (seen %d, expected %d)\n",
+                      top - decoder->stack, num_args ));
+
+#endif /* FT_DEBUG_LEVEL_TRACE */
+
+        top -= num_args;
+
+        switch ( op )
+        {
+        case op_hsbw:
+          FT_TRACE4(( " hsbw" ));
+
+          builder->parse_state = T1_Parse_Have_Width;
+
+          builder->left_bearing.x = ADD_LONG( builder->left_bearing.x,
+                                              top[0] );
+
+          builder->advance.x = top[1];
+          builder->advance.y = 0;
+
+          /* we only want to compute the glyph's metrics */
+          /* (lsb + advance width), not load the rest of */
+          /* it; so exit immediately                     */
+          return FT_Err_Ok;
+
+        case op_sbw:
+          FT_TRACE4(( " sbw" ));
+
+          builder->parse_state = T1_Parse_Have_Width;
+
+          builder->left_bearing.x = ADD_LONG( builder->left_bearing.x,
+                                              top[0] );
+          builder->left_bearing.y = ADD_LONG( builder->left_bearing.y,
+                                              top[1] );
+
+          builder->advance.x = top[2];
+          builder->advance.y = top[3];
+
+          /* we only want to compute the glyph's metrics */
+          /* (lsb + advance width), not load the rest of */
+          /* it; so exit immediately                     */
+          return FT_Err_Ok;
+
+        default:
+          FT_ERROR(( "t1_decoder_parse_metrics:"
+                     " unhandled opcode %d\n", op ));
+          goto Syntax_Error;
+        }
+
+      } /* general operator processing */
+
+    } /* while ip < limit */
+
+    FT_TRACE4(( "..end..\n\n" ));
+
+  No_Width:
+    FT_ERROR(( "t1_decoder_parse_metrics:"
+               " no width, found op %d instead\n",
+               ip[-1] ));
+  Syntax_Error:
+    return FT_THROW( Syntax_Error );
+
+  Stack_Underflow:
+    return FT_THROW( Stack_Underflow );
   }
+#endif /* T1_CONFIG_OPTION_OLD_ENGINE */
 
 
   /* initialize T1 decoder */
   FT_LOCAL_DEF( void )
   t1_decoder_done( T1_Decoder  decoder )
   {
+    FT_Memory  memory = decoder->builder.memory;
+
+
     t1_builder_done( &decoder->builder );
+
+    if ( decoder->cf2_instance.finalizer )
+    {
+      decoder->cf2_instance.finalizer( decoder->cf2_instance.data );
+      FT_FREE( decoder->cf2_instance.data );
+    }
   }
 
 
index 12c27de..1d9718d 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PostScript Type 1 decoding routines (specification).                 */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -31,7 +31,11 @@ FT_BEGIN_HEADER
   FT_CALLBACK_TABLE
   const T1_Decoder_FuncsRec  t1_decoder_funcs;
 
+  FT_LOCAL( FT_Int )
+  t1_lookup_glyph_by_stdcharcode_ps( PS_Decoder*  decoder,
+                                     FT_Int       charcode );
 
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
   FT_LOCAL( FT_Error )
   t1_decoder_parse_glyph( T1_Decoder  decoder,
                           FT_UInt     glyph_index );
@@ -40,6 +44,12 @@ FT_BEGIN_HEADER
   t1_decoder_parse_charstrings( T1_Decoder  decoder,
                                 FT_Byte*    base,
                                 FT_UInt     len );
+#else
+  FT_LOCAL( FT_Error )
+  t1_decoder_parse_metrics( T1_Decoder  decoder,
+                            FT_Byte*    charstring_base,
+                            FT_UInt     charstring_len );
+#endif
 
   FT_LOCAL( FT_Error )
   t1_decoder_init( T1_Decoder           decoder,
index 2b65271..3f5f0ae 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/pshinter Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 77e35c4..06707be 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 9ad1a3a..b98077c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PostScript hinting algorithm (body).                                 */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used        */
@@ -26,7 +26,7 @@
 
 
 #undef  FT_COMPONENT
-#define FT_COMPONENT  trace_pshalgo2
+#define FT_COMPONENT  trace_pshalgo
 
 
 #ifdef DEBUG_HINTER
index 62e97d1..c50683f 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PostScript hinting algorithm (specification).                        */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index c68770c..29f328d 100644 (file)
@@ -5,7 +5,7 @@
 /*    PostScript hinter global hinting management (body).                  */
 /*    Inspired by the new auto-hinter module.                              */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used        */
index 8801cba..cf80bf4 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PostScript hinter global hinting management.                         */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 13e07e1..0eedac4 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PostScript Hinting module                                   */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 860dc0a..0b8f6f9 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PostScript hinter module implementation (body).             */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 1d2b40f..556de2f 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PostScript hinter module interface (specification).                  */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 73d144e..b9d02d2 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PS Hinter error codes (specification only).                          */
 /*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
+/*  Copyright 2003-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index c0d3a64..465ad31 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for pshinter module. */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 8d9a01c..4469ba8 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for pshinter module. */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index fff6d34..6648d13 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PostScript hints recorder (body).                           */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index e10bc2b..7e3dfe0 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Postscript (Type1/Type2) hints recorder (specification).             */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 2be6404..966690e 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 5a6e2c0..a0fd373 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/psnames Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index ddd2296..410f48a 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 3ff8cb9..8929ebe 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PSNames module implementation (body).                                */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 
 #include "psmodule.h"
 
+  /*
+   *  The file `pstables.h' with its arrays and its function
+   *  `ft_get_adobe_glyph_index' is useful for other projects also (for
+   *  example, `pdfium' is using it).  However, if used as a C++ header,
+   *  including it in two different source files makes it necessary to use
+   *  `extern const' for the declaration of its arrays, otherwise the data
+   *  would be duplicated as mandated by the C++ standard.
+   *
+   *  For this reason, we use `DEFINE_PS_TABLES' to guard the function
+   *  definitions, and `DEFINE_PS_TABLES_DATA' to provide both proper array
+   *  declarations and definitions.
+   */
 #include "pstables.h"
 #define  DEFINE_PS_TABLES
+#define  DEFINE_PS_TABLES_DATA
 #include "pstables.h"
 
 #include "psnamerr.h"
index 6983b79..3e94f8b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level PSNames module interface (specification).                 */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index f90bf5e..14eb76c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PS names module error codes (specification only).                    */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 22466d6..febb80d 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType PSNames module component (body only).                       */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 8b90034..85a06f3 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for psnames module.  */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 14497e7..889780c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for psnames module.  */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index e0f5e30..79545ee 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PostScript glyph names.                                              */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -19,7 +19,7 @@
   /* This file has been generated automatically -- do not edit! */
 
 
-#ifndef  DEFINE_PS_TABLES
+#ifndef  DEFINE_PS_TABLES_DATA
 #ifdef  __cplusplus
   extern "C"
 #else
@@ -27,7 +27,7 @@
 #endif
 #endif
   const char  ft_standard_glyph_names[3696]
-#ifdef  DEFINE_PS_TABLES
+#ifdef  DEFINE_PS_TABLES_DATA
   =
   {
     '.','n','u','l','l', 0,
     'R','o','m','a','n', 0,
     'S','e','m','i','b','o','l','d', 0,
   }
-#endif /* DEFINE_PS_TABLES */
+#endif /* DEFINE_PS_TABLES_DATA */
   ;
 
 
 
   /* Values are offsets into the `ft_standard_glyph_names' table */
 
-#ifndef  DEFINE_PS_TABLES
+#ifndef  DEFINE_PS_TABLES_DATA
 #ifdef  __cplusplus
   extern "C"
 #else
 #endif
 #endif
   const short  ft_mac_names[FT_NUM_MAC_NAMES]
-#ifdef  DEFINE_PS_TABLES
+#ifdef  DEFINE_PS_TABLES_DATA
   =
   {
      253,   0,   6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351,
     1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200,
      209, 218, 225, 232, 239, 246
   }
-#endif /* DEFINE_PS_TABLES */
+#endif /* DEFINE_PS_TABLES_DATA */
   ;
 
 
 
   /* Values are offsets into the `ft_standard_glyph_names' table */
 
-#ifndef  DEFINE_PS_TABLES
+#ifndef  DEFINE_PS_TABLES_DATA
 #ifdef  __cplusplus
   extern "C"
 #else
 #endif
 #endif
   const short  ft_sid_names[FT_NUM_SID_NAMES]
-#ifdef  DEFINE_PS_TABLES
+#ifdef  DEFINE_PS_TABLES_DATA
   =
   {
      253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365,
     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
   }
-#endif /* DEFINE_PS_TABLES */
+#endif /* DEFINE_PS_TABLES_DATA */
   ;
 
 
   /* the following are indices into the SID name table */
-#ifndef  DEFINE_PS_TABLES
+#ifndef  DEFINE_PS_TABLES_DATA
 #ifdef  __cplusplus
   extern "C"
 #else
 #endif
 #endif
   const unsigned short  t1_standard_encoding[256]
-#ifdef  DEFINE_PS_TABLES
+#ifdef  DEFINE_PS_TABLES_DATA
   =
   {
       0,  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
   }
-#endif /* DEFINE_PS_TABLES */
+#endif /* DEFINE_PS_TABLES_DATA */
   ;
 
 
   /* the following are indices into the SID name table */
-#ifndef  DEFINE_PS_TABLES
+#ifndef  DEFINE_PS_TABLES_DATA
 #ifdef  __cplusplus
   extern "C"
 #else
 #endif
 #endif
   const unsigned short  t1_expert_encoding[256]
-#ifdef  DEFINE_PS_TABLES
+#ifdef  DEFINE_PS_TABLES_DATA
   =
   {
       0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
     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 /* DEFINE_PS_TABLES */
+#endif /* DEFINE_PS_TABLES_DATA */
   ;
 
 
 
 #ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
 
-#ifndef  DEFINE_PS_TABLES
+#ifndef  DEFINE_PS_TABLES_DATA
 #ifdef  __cplusplus
   extern "C"
 #else
 #endif
 #endif
   const unsigned char  ft_adobe_glyph_list[55997L]
-#ifdef  DEFINE_PS_TABLES
+#ifdef  DEFINE_PS_TABLES_DATA
   =
   {
       0, 52,  0,106,  2,167,  3, 63,  4,220,  6,125,  9,143, 10, 23,
     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
   }
-#endif /* DEFINE_PS_TABLES */
+#endif /* DEFINE_PS_TABLES_DATA */
   ;
 
 
index 69fa732..4d629d8 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index c9f3d6c..838e7ef 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/raster Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index d1e6627..7e40119 100644 (file)
@@ -5,7 +5,7 @@
 /*    Miscellaneous macros for stand-alone rasterizer (specification       */
 /*    only).                                                               */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used        */
index c5643f6..4354730 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType glyph rasterizer (body).                                */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 6b3050c..40b5d6d 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType glyph rasterizer (specification).                       */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used        */
index 1a83e9e..a7ce973 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType glyph rasterizer interface (body).                      */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
   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 );
+    render->clazz->raster_class->raster_reset( render->raster, NULL, 0 );
 
     return FT_Err_Ok;
   }
                      FT_Render_Mode    mode,
                      const FT_Vector*  origin )
   {
-    FT_Error     error;
-    FT_Outline*  outline;
-    FT_BBox      cbox, cbox0;
-    FT_UInt      width, height, pitch;
-    FT_Bitmap*   bitmap;
-    FT_Memory    memory;
+    FT_Error     error   = FT_Err_Ok;
+    FT_Outline*  outline = &slot->outline;
+    FT_Bitmap*   bitmap  = &slot->bitmap;
+    FT_Memory    memory  = render->root.memory;
+    FT_Pos       x_shift = 0;
+    FT_Pos       y_shift = 0;
 
     FT_Raster_Params  params;
 
       return FT_THROW( 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, &cbox0 );
-
-    /* undocumented but confirmed: bbox values get rounded */
-#if 1
-    cbox.xMin = FT_PIX_ROUND( cbox0.xMin );
-    cbox.yMin = FT_PIX_ROUND( cbox0.yMin );
-    cbox.xMax = FT_PIX_ROUND( cbox0.xMax );
-    cbox.yMax = FT_PIX_ROUND( cbox0.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
-
-    /* If either `width' or `height' round to 0, try    */
-    /* explicitly rounding up/down.  In the case of     */
-    /* glyphs containing only one very narrow feature,  */
-    /* this gives the drop-out compensation in the scan */
-    /* conversion code a chance to do its stuff.        */
-    width  = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 );
-    if ( width == 0 )
-    {
-      cbox.xMin = FT_PIX_FLOOR( cbox0.xMin );
-      cbox.xMax = FT_PIX_CEIL( cbox0.xMax );
-
-      width = (FT_UInt)( ( cbox.xMax - cbox.xMin ) >> 6 );
-    }
-
-    height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 );
-    if ( height == 0 )
-    {
-      cbox.yMin = FT_PIX_FLOOR( cbox0.yMin );
-      cbox.yMax = FT_PIX_CEIL( cbox0.yMax );
-
-      height = (FT_UInt)( ( cbox.yMax - cbox.yMin ) >> 6 );
-    }
-
-    if ( width > FT_USHORT_MAX || height > FT_USHORT_MAX )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    bitmap = &slot->bitmap;
-    memory = render->root.memory;
-
     /* release old bitmap buffer */
     if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
     {
       slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
     }
 
-    pitch              = ( ( width + 15 ) >> 4 ) << 1;
-    bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
+    ft_glyphslot_preset_bitmap( slot, mode, origin );
 
-    bitmap->width = width;
-    bitmap->rows  = height;
-    bitmap->pitch = (int)pitch;
-
-    if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) )
+    /* allocate new one */
+    if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, bitmap->pitch ) )
       goto Exit;
 
     slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
 
+    x_shift = -slot->bitmap_left * 64;
+    y_shift = ( (FT_Int)bitmap->rows - slot->bitmap_top ) * 64;
+
+    if ( origin )
+    {
+      x_shift += origin->x;
+      y_shift += origin->y;
+    }
+
     /* translate outline to render it into the bitmap */
-    FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin );
+    if ( x_shift || y_shift )
+      FT_Outline_Translate( outline, x_shift, y_shift );
 
     /* set up parameters */
     params.target = bitmap;
     params.source = outline;
-    params.flags  = 0;
+    params.flags  = FT_RASTER_FLAG_DEFAULT;
 
     /* render outline into the bitmap */
     error = render->raster_render( render->raster, &params );
 
-    FT_Outline_Translate( outline, cbox.xMin, cbox.yMin );
-
-    if ( error )
-      goto Exit;
+  Exit:
+    if ( !error )
+      /* everything is fine; the glyph is now officially a bitmap */
+      slot->format = FT_GLYPH_FORMAT_BITMAP;
+    else if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
+    {
+      FT_FREE( bitmap->buffer );
+      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
+    }
 
-    slot->format      = FT_GLYPH_FORMAT_BITMAP;
-    slot->bitmap_left = (FT_Int)( cbox.xMin >> 6 );
-    slot->bitmap_top  = (FT_Int)( cbox.yMax >> 6 );
+    if ( x_shift || y_shift )
+      FT_Outline_Translate( outline, -x_shift, -y_shift );
 
-  Exit:
     return error;
   }
 
index cff702d..2abdf2d 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType glyph rasterizer interface (specification).             */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index aad39cb..b115f41 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 46a6690..76edd21 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType monochrome rasterer module component (body only).           */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 0d64690..22a3e15 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    monochrome renderer error codes (specification only).                */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 7085339..1dc8981 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for raster module.   */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index dcd6913..6d0877c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for raster module.   */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 0462c93..9aef1f0 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 5971b25..57977fc 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/sfnt Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 81dea17..51ca67e 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index b9b296e..1602026 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PNG Bitmap glyph support.                                            */
 /*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  Google, Inc.                                                           */
 /*  Written by Stuart Gill and Behdad Esfahbod.                            */
 /*                                                                         */
   }
 
 
-  /* Premultiplies data and converts RGBA bytes => native endian. */
+  /* Premultiplies data and converts RGBA bytes => BGRA. */
   static void
   premultiply_data( png_structp    png,
                     png_row_infop  row_info,
                     png_bytep      data )
   {
-    unsigned int  i;
+    unsigned int  i = 0, limit;
+
+    /* The `vector_size' attribute was introduced in gcc 3.1, which */
+    /* predates clang; the `__BYTE_ORDER__' preprocessor symbol was */
+    /* introduced in gcc 4.6 and clang 3.2, respectively.           */
+    /* `__builtin_shuffle' for gcc was introduced in gcc 4.7.0.     */
+#if ( ( defined( __GNUC__ )                                &&             \
+        ( ( __GNUC__ >= 5 )                              ||               \
+        ( ( __GNUC__ == 4 ) && ( __GNUC_MINOR__ >= 7 ) ) ) )         ||   \
+      ( defined( __clang__ )                                       &&     \
+        ( ( __clang_major__ >= 4 )                               ||       \
+        ( ( __clang_major__ == 3 ) && ( __clang_minor__ >= 2 ) ) ) ) ) && \
+    defined( __OPTIMIZE__ )                                            && \
+    __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+
+#ifdef __clang__
+    /* the clang documentation doesn't cover the two-argument case of */
+    /* `__builtin_shufflevector'; however, it is is implemented since */
+    /* version 2.8                                                    */
+#define vector_shuffle  __builtin_shufflevector
+#else
+#define vector_shuffle  __builtin_shuffle
+#endif
 
-    FT_UNUSED( png );
+    typedef unsigned short  v82 __attribute__(( vector_size( 16 ) ));
 
 
-    for ( i = 0; i < row_info->rowbytes; i += 4 )
+    if ( row_info->rowbytes > 15 )
+    {
+      /* process blocks of 16 bytes in one rush, which gives a nice speed-up */
+      limit = row_info->rowbytes - 16 + 1;
+      for ( ; i < limit; i += 16 )
+      {
+        unsigned char*  base = &data[i];
+
+        v82  s, s0, s1, a;
+
+        /* clang <= 3.9 can't apply scalar values to vectors */
+        /* (or rather, it needs a different syntax)          */
+        v82  n0x80 = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
+        v82  n0xFF = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
+        v82  n8    = { 8, 8, 8, 8, 8, 8, 8, 8 };
+
+        v82  ma = { 1, 1, 3, 3, 5, 5, 7, 7 };
+        v82  o1 = { 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF };
+        v82  m0 = { 1, 0, 3, 2, 5, 4, 7, 6 };
+
+
+        ft_memcpy( &s, base, 16 );            /* RGBA RGBA RGBA RGBA */
+        s0 = s & n0xFF;                       /*  R B  R B  R B  R B */
+        s1 = s >> n8;                         /*  G A  G A  G A  G A */
+
+        a   = vector_shuffle( s1, ma );       /*  A A  A A  A A  A A */
+        s1 |= o1;                             /*  G 1  G 1  G 1  G 1 */
+        s0  = vector_shuffle( s0, m0 );       /*  B R  B R  B R  B R */
+
+        s0 *= a;
+        s1 *= a;
+        s0 += n0x80;
+        s1 += n0x80;
+        s0  = ( s0 + ( s0 >> n8 ) ) >> n8;
+        s1  = ( s1 + ( s1 >> n8 ) ) >> n8;
+
+        s = s0 | ( s1 << n8 );
+        ft_memcpy( base, &s, 16 );
+      }
+    }
+#endif /* use `vector_size' */
+
+    FT_UNUSED( png );
+
+    limit = row_info->rowbytes;
+    for ( ; i < limit; i += 4 )
     {
       unsigned char*  base  = &data[i];
       unsigned int    alpha = base[3];
       return;
     }
 
-    memcpy( data, stream->cursor, length );
+    ft_memcpy( data, stream->cursor, length );
 
     FT_FRAME_EXIT();
   }
index 344ecea..194238c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    PNG Bitmap glyph support.                                            */
 /*                                                                         */
-/*  Copyright 2013-2017 by                                                 */
+/*  Copyright 2013-2018 by                                                 */
 /*  Google, Inc.                                                           */
 /*  Written by Stuart Gill and Behdad Esfahbod.                            */
 /*                                                                         */
index 230d56c..83acc66 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 991433e..303e1ca 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level SFNT driver interface (body).                             */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
                        NULL,
                        &mm_var );
 
-    if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) )
+    if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) &&
+         !FT_IS_VARIATION( FT_FACE( face ) )     )
     {
       SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
 
       return face->postscript_name;
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-    if ( face->blend )
+    if ( face->blend                                 &&
+         ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ||
+           FT_IS_VARIATION( FT_FACE( face ) )      ) )
     {
       face->postscript_name = sfnt_get_var_ps_name( face );
       return face->postscript_name;
index 38710b6..81c22d2 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level SFNT driver interface (specification).                    */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 3cf73d7..74003d4 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    SFNT error codes (specification only).                               */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 6cf8c9e..8b9a6b3 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Single object library component.                                     */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 8eadd60..db2d816 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for sfnt module.     */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 3afb668..8f43122 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for sfnt module.     */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index ac2e620..0c91703 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    SFNT object management (base).                                       */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
          tag != TTAG_OTTO    &&
          tag != TTAG_true    &&
          tag != TTAG_typ1    &&
+         tag != TTAG_0xA5kbd &&
+         tag != TTAG_0xA5lst &&
          tag != 0x00020000UL )
     {
       FT_TRACE2(( "  not a font using the SFNT container format\n" ));
       FT_Byte*  instance_values = NULL;
 
 
-      face->is_default_instance = 1;
-
       instance_index = FT_ABS( face_instance_index ) >> 16;
 
       /* test whether current face is a GX font with named instances */
         goto Exit;
     }
 
-    if ( face->header.Units_Per_EM == 0 )
+    /* OpenType 1.8.2 introduced limits to this value;    */
+    /* however, they make sense for older SFNT fonts also */
+    if ( face->header.Units_Per_EM <    16 ||
+         face->header.Units_Per_EM > 16384 )
     {
       error = FT_THROW( Invalid_Table );
 
       /* Polish the charmaps.                                              */
       /*                                                                   */
       /*   Try to set the charmap encoding according to the platform &     */
-      /*   encoding ID of each charmap.                                    */
+      /*   encoding ID of each charmap.  Emulate Unicode charmap if one    */
+      /*   is missing.                                                     */
       /*                                                                   */
 
       tt_face_build_cmaps( face );  /* ignore errors */
 
       /* set the encoding fields */
       {
-        FT_Int  m;
+        FT_Int   m;
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+        FT_Bool  has_unicode = FALSE;
+#endif
 
 
         for ( m = 0; m < root->num_charmaps; m++ )
           charmap->encoding = sfnt_find_encoding( charmap->platform_id,
                                                   charmap->encoding_id );
 
-#if 0
-          if ( !root->charmap                           &&
-               charmap->encoding == FT_ENCODING_UNICODE )
-          {
-            /* set 'root->charmap' to the first Unicode encoding we find */
-            root->charmap = charmap;
-          }
-#endif
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+          if ( charmap->encoding == FT_ENCODING_UNICODE   ||
+               charmap->encoding == FT_ENCODING_MS_SYMBOL )  /* PUA */
+            has_unicode = TRUE;
+        }
+
+        /* synthesize Unicode charmap if one is missing */
+        if ( !has_unicode )
+        {
+          FT_CharMapRec cmaprec;
+
+
+          cmaprec.face        = root;
+          cmaprec.platform_id = TT_PLATFORM_MICROSOFT;
+          cmaprec.encoding_id = TT_MS_ID_UNICODE_CS;
+          cmaprec.encoding    = FT_ENCODING_UNICODE;
+
+
+          error = FT_CMap_New( (FT_CMap_Class)&tt_cmap_unicode_class_rec,
+                               NULL, &cmaprec, NULL );
+          if ( error                                      &&
+               FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )
+            goto Exit;
+          error = FT_Err_Ok;
+
+#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
         }
       }
 
           (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.  */
+        /* See https://www.microsoft.com/typography/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;
index 7053814..1b8d1be 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    SFNT object management (specification).                              */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 2196e37..534201f 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType and OpenType embedded BDF properties (body).                */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 398b620..809a663 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType and OpenType embedded BDF properties (specification).       */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -28,6 +28,8 @@
 FT_BEGIN_HEADER
 
 
+#ifdef TT_CONFIG_OPTION_BDF
+
   FT_LOCAL( void )
   tt_face_free_bdf_props( TT_Face  face );
 
@@ -37,6 +39,8 @@ FT_BEGIN_HEADER
                          const char*       property_name,
                          BDF_PropertyRec  *aprop );
 
+#endif /* TT_CONFIG_OPTION_BDF */
+
 
 FT_END_HEADER
 
index 5afa6ae..8cc70f7 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType character mapping table (cmap) support (body).              */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 
 #include FT_INTERNAL_VALIDATE_H
 #include FT_INTERNAL_STREAM_H
+#include FT_SERVICE_POSTSCRIPT_CMAPS_H
 #include "ttload.h"
 #include "ttcmap.h"
+#include "ttpost.h"
 #include "sfntpic.h"
 
 
 
 
         if ( offset == 0 )
+        {
+          if ( charcode == 0x100 )
+            goto Exit; /* this happens only for a malformed cmap */
           goto Next_SubHeader;
+        }
 
         if ( char_lo < start )
         {
         }
       }
 
-      /* jump to next sub-header, i.e. higher byte value */
+      /* If `charcode' is <= 0xFF, retry with `charcode + 1'.  If        */
+      /* `charcode' is 0x100 after the loop, do nothing since we have    */
+      /* just reached the first sub-header for two-byte character codes. */
+      /*                                                                 */
+      /* For all other cases, we jump to the next sub-header and adjust  */
+      /* `charcode' accordingly.                                         */
     Next_SubHeader:
-      charcode = FT_PAD_FLOOR( charcode, 256 ) + 256;
+      if ( charcode <= 0xFF )
+        charcode++;
+      else if ( charcode == 0x100 )
+        ;
+      else
+        charcode = FT_PAD_FLOOR( charcode, 0x100 ) + 0x100;
     }
 
   Exit:
 #endif /* TT_CONFIG_CMAP_FORMAT_14 */
 
 
+  /*************************************************************************/
+  /*************************************************************************/
+  /*****                                                               *****/
+  /*****                       SYNTHETIC UNICODE                       *****/
+  /*****                                                               *****/
+  /*************************************************************************/
+  /*************************************************************************/
+
+  /*        This charmap is generated using postscript glyph names.        */
+
+#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
+
+  FT_CALLBACK_DEF( const char * )
+  tt_get_glyph_name( TT_Face  face,
+                     FT_UInt  idx )
+  {
+    FT_String*  PSname;
+
+
+    tt_face_get_ps_name( face, idx, &PSname );
+
+    return PSname;
+  }
+
+
+  FT_CALLBACK_DEF( FT_Error )
+  tt_cmap_unicode_init( PS_Unicodes  unicodes,
+                        FT_Pointer   pointer )
+  {
+    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
+    FT_Memory           memory  = FT_FACE_MEMORY( face );
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
+
+    FT_UNUSED( pointer );
+
+
+    return psnames->unicodes_init( memory,
+                                   unicodes,
+                                   face->root.num_glyphs,
+                                   (PS_GetGlyphNameFunc)&tt_get_glyph_name,
+                                   (PS_FreeGlyphNameFunc)NULL,
+                                   (FT_Pointer)face );
+  }
+
+
+  FT_CALLBACK_DEF( void )
+  tt_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 )
+  tt_cmap_unicode_char_index( PS_Unicodes  unicodes,
+                              FT_UInt32    char_code )
+  {
+    TT_Face             face    = (TT_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 )
+  tt_cmap_unicode_char_next( PS_Unicodes  unicodes,
+                             FT_UInt32   *pchar_code )
+  {
+    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
+    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
+
+
+    return psnames->unicodes_char_next( unicodes, pchar_code );
+  }
+
+
+  FT_DEFINE_TT_CMAP(
+    tt_cmap_unicode_class_rec,
+
+      sizeof ( PS_UnicodesRec ),
+
+      (FT_CMap_InitFunc)     tt_cmap_unicode_init,        /* init       */
+      (FT_CMap_DoneFunc)     tt_cmap_unicode_done,        /* done       */
+      (FT_CMap_CharIndexFunc)tt_cmap_unicode_char_index,  /* char_index */
+      (FT_CMap_CharNextFunc) tt_cmap_unicode_char_next,   /* char_next  */
+
+      (FT_CMap_CharVarIndexFunc)    NULL,  /* char_var_index   */
+      (FT_CMap_CharVarIsDefaultFunc)NULL,  /* char_var_default */
+      (FT_CMap_VariantListFunc)     NULL,  /* variant_list     */
+      (FT_CMap_CharVariantListFunc) NULL,  /* charvariant_list */
+      (FT_CMap_VariantCharListFunc) NULL,  /* variantchar_list */
+
+    ~0U,
+    (TT_CMap_ValidateFunc)NULL,  /* validate      */
+    (TT_CMap_Info_GetFunc)NULL   /* get_cmap_info */
+  )
+
+#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
+
 #ifndef FT_CONFIG_OPTION_PIC
 
   static const TT_CMap_Class  tt_cmap_classes[] =
     FT_CMap        cmap  = (FT_CMap)charmap;
     TT_CMap_Class  clazz = (TT_CMap_Class)cmap->clazz;
 
-
-    return clazz->get_cmap_info( charmap, cmap_info );
+    if ( clazz->get_cmap_info )
+      return clazz->get_cmap_info( charmap, cmap_info );
+    else
+      return FT_THROW( Invalid_CharMap_Format );
   }
 
 
index 83f12df..d264d99 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType character mapping table (cmap) support (specification).     */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -141,6 +141,8 @@ FT_BEGIN_HEADER
 #define TT_VALID_GLYPH_COUNT( x )  TT_VALIDATOR( x )->num_glyphs
 
 
+  FT_CALLBACK_TABLE const TT_CMap_ClassRec  tt_cmap_unicode_class_rec;
+
   FT_LOCAL( FT_Error )
   tt_face_build_cmaps( TT_Face  face );
 
index 9a5e708..4980e9d 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TT CMAP classes definitions (specification only).                    */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index c97e578..68f15a2 100644 (file)
@@ -5,7 +5,7 @@
 /*    Load the basic TrueType kerning table.  This doesn't handle          */
 /*    kerning data within the GPOS table at the moment.                    */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -85,7 +85,7 @@
 
     for ( nn = 0; nn < num_tables; nn++ )
     {
-      FT_UInt    num_pairs, length, coverage;
+      FT_UInt    num_pairs, length, coverage, format;
       FT_Byte*   p_next;
       FT_UInt32  mask = (FT_UInt32)1UL << nn;
 
       if ( p_next > p_limit )  /* handle broken table */
         p_next = p_limit;
 
+      format = coverage >> 8;
+
+      /* we currently only support format 0 kerning tables */
+      if ( format != 0 )
+        goto NextTable;
+
       /* only use horizontal kerning tables */
       if ( ( coverage & 3U ) != 0x0001 ||
            p + 8 > p_next              )
index db1a30b..4e45d09 100644 (file)
@@ -5,7 +5,7 @@
 /*    Load the basic TrueType kerning table.  This doesn't handle          */
 /*    kerning data within the GPOS table at the moment.                    */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index df99baa..a86a546 100644 (file)
@@ -5,7 +5,7 @@
 /*    Load the basic TrueType tables, i.e., tables that can be either in   */
 /*    TTF or OTF fonts (body).                                             */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
     SFNT_HeaderRec  sfnt;
     FT_Error        error;
     FT_Memory       memory = stream->memory;
-    FT_UShort       nn, valid_entries;
+    FT_UShort       nn, valid_entries = 0;
 
     static const FT_Frame_Field  offset_table_fields[] =
     {
index 296da86..f94be8b 100644 (file)
@@ -5,7 +5,7 @@
 /*    Load the basic TrueType tables, i.e., tables that can be either in   */
 /*    TTF or OTF fonts (specification).                                    */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 394c6db..6ddda95 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Load the metrics tables common to TTF and OTF fonts (body).          */
 /*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 2b93ab2..ab00acd 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Load the metrics tables common to TTF and OTF fonts (specification). */
 /*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
+/*  Copyright 2006-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 540d5f2..f140649 100644 (file)
@@ -5,7 +5,7 @@
 /*    PostScript name table processing for TrueType and OpenType fonts     */
 /*    (body).                                                              */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
     FT_UNUSED( post_limit );
 
 
-    /* UNDOCUMENTED!  This value appears only in the Apple TT specs. */
     if ( FT_READ_USHORT( num_glyphs ) )
       goto Exit;
 
     /* now read postscript table */
     if ( format == 0x00020000L )
       error = load_format_20( face, stream, post_limit );
-    else if ( format == 0x00028000L )
+    else if ( format == 0x00025000L )
       error = load_format_25( face, stream, post_limit );
     else
       error = FT_THROW( Invalid_File_Format );
         FT_FREE( table->glyph_names );
         table->num_names = 0;
       }
-      else if ( format == 0x00028000L )
+      else if ( format == 0x00025000L )
       {
         TT_Post_25  table = &names->names.format_25;
 
           *PSname = (FT_String*)table->glyph_names[name_index - 258];
       }
     }
-    else if ( format == 0x00028000L )
+    else if ( format == 0x00025000L )
     {
       TT_Post_25  table = &names->names.format_25;
 
index 722485e..3bec07e 100644 (file)
@@ -5,7 +5,7 @@
 /*    PostScript name table processing for TrueType and OpenType fonts     */
 /*    (specification).                                                     */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 0c76a55..53e6175 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType and OpenType embedded bitmap support (body).                */
 /*                                                                         */
-/*  Copyright 2005-2017 by                                                 */
+/*  Copyright 2005-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  Copyright 2013 by Google, Inc.                                         */
         metrics->max_advance =
           FT_MulDiv( hori->advance_Width_Max, ppem_ * 64, upem );
 
+        /* set the scale values (in 16.16 units) so advances */
+        /* from the hmtx and vmtx table are scaled correctly */
+        metrics->x_scale = FT_MulDiv( metrics->x_ppem,
+                                      64 * 0x10000,
+                                      face->header.Units_Per_EM );
+        metrics->y_scale = FT_MulDiv( metrics->y_ppem,
+                                      64 * 0x10000,
+                                      face->header.Units_Per_EM );
+
         return error;
       }
 
       goto Fail;
     }
 
-    FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %d components\n",
-                num_components ));
+    FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %d component%s\n",
+                num_components,
+                num_components == 1 ? "" : "s" ));
 
     for ( nn = 0; nn < num_components; nn++ )
     {
     return FT_THROW( Invalid_Table );
 
   NoBitmap:
+    if ( recurse_count )
+    {
+      FT_TRACE4(( "tt_sbit_decoder_load_image:"
+                  " missing subglyph sbit with glyph index %d\n",
+                  glyph_index ));
+      return FT_THROW( Invalid_Composite );
+    }
+
     FT_TRACE4(( "tt_sbit_decoder_load_image:"
                 " no sbit found for glyph index %d\n", glyph_index ));
-
-    return FT_THROW( Invalid_Argument );
+    return FT_THROW( Missing_Bitmap );
   }
 
 
index e859ddd..ce2af3c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType and OpenType embedded bitmap support (specification).       */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 4cd0769..9957d5e 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/smooth Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index e9a3ce7..6ce6f86 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    A new `perfect' anti-aliasing renderer (body).                       */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 #define FT_INT_MAX    INT_MAX
 #define FT_ULONG_MAX  ULONG_MAX
 
+#define ADD_LONG( a, b )                                    \
+          (long)( (unsigned long)(a) + (unsigned long)(b) )
+#define SUB_LONG( a, b )                                    \
+          (long)( (unsigned long)(a) - (unsigned long)(b) )
+#define MUL_LONG( a, b )                                    \
+          (long)( (unsigned long)(a) * (unsigned long)(b) )
+#define NEG_LONG( a )                                       \
+          (long)( -(unsigned long)(a) )
+
+
 #define ft_memset   memset
 
 #define ft_setjmp   setjmp
@@ -264,6 +274,7 @@ typedef ptrdiff_t  FT_PtrDist;
 #include "ftgrays.h"
 #include FT_INTERNAL_OBJECTS_H
 #include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_CALC_H
 #include FT_OUTLINE_H
 
 #include "ftsmerrs.h"
@@ -359,7 +370,7 @@ typedef ptrdiff_t  FT_PtrDist;
   /* optimize a division and modulo operation on the same parameters   */
   /* into a single call to `__aeabi_idivmod'.  See                     */
   /*                                                                   */
-  /*  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43721                */
+  /*  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43721               */
 #undef FT_DIV_MOD
 #define FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \
   FT_BEGIN_STMNT                                                   \
@@ -571,8 +582,8 @@ typedef ptrdiff_t  FT_PtrDist;
     if ( ex < ras.min_ex )
       ex = ras.min_ex - 1;
 
-    /* record the current one if it is valid */
-    if ( !ras.invalid )
+    /* record the current one if it is valid and substantial */
+    if ( !ras.invalid && ( ras.area || ras.cover ) )
       gray_record_cell( RAS_VAR );
 
     ras.area  = 0;
@@ -1135,7 +1146,7 @@ typedef ptrdiff_t  FT_PtrDist;
       /* 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 );
+      s = FT_ABS( SUB_LONG( MUL_LONG( dy, dx1 ), MUL_LONG( dx, dy1 ) ) );
 
       if ( s > s_limit )
         goto Split;
@@ -1143,7 +1154,7 @@ typedef ptrdiff_t  FT_PtrDist;
       /* 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 );
+      s = FT_ABS( SUB_LONG( MUL_LONG( dy, dx2 ), MUL_LONG( dx, dy2 ) ) );
 
       if ( s > s_limit )
         goto Split;
@@ -1289,8 +1300,6 @@ typedef ptrdiff_t  FT_PtrDist;
     int  y;
 
 
-    FT_TRACE7(( "gray_sweep: start\n" ));
-
     for ( y = ras.min_ey; y < ras.max_ey; y++ )
     {
       PCell   cell  = ras.ycells[y - ras.min_ey];
@@ -1316,8 +1325,6 @@ typedef ptrdiff_t  FT_PtrDist;
       if ( cover != 0 )
         gray_hline( RAS_VAR_ x, y, cover, ras.max_ex - x );
     }
-
-    FT_TRACE7(( "gray_sweep: end\n" ));
   }
 
 
@@ -1711,8 +1718,11 @@ typedef ptrdiff_t  FT_PtrDist;
       if ( !ras.invalid )
         gray_record_cell( RAS_VAR );
 
-      FT_TRACE7(( "band [%d..%d]: %d cells\n",
-                  ras.min_ey, ras.max_ey, ras.num_cells ));
+      FT_TRACE7(( "band [%d..%d]: %d cell%s\n",
+                  ras.min_ey,
+                  ras.max_ey,
+                  ras.num_cells,
+                  ras.num_cells == 1 ? "" : "s" ));
     }
     else
     {
@@ -1729,35 +1739,43 @@ typedef ptrdiff_t  FT_PtrDist;
   static int
   gray_convert_glyph( RAS_ARG )
   {
+    const TCoord  yMin = ras.min_ey;
+    const TCoord  yMax = ras.max_ey;
+    const TCoord  xMin = ras.min_ex;
+    const TCoord  xMax = ras.max_ex;
+
     TCell    buffer[FT_MAX_GRAY_POOL];
-    TCoord   band_size = FT_MAX_GRAY_POOL / 8;
-    TCoord   count = ras.max_ey - ras.min_ey;
-    int      num_bands;
-    TCoord   min, max, max_y;
+    size_t   height = (size_t)( yMax - yMin );
+    size_t   n = FT_MAX_GRAY_POOL / 8;
+    TCoord   y;
     TCoord   bands[32];  /* enough to accommodate bisections */
     TCoord*  band;
 
 
     /* set up vertical bands */
-    if ( count > band_size )
+    if ( height > n )
     {
       /* two divisions rounded up */
-      num_bands = (int)( ( count + band_size - 1) / band_size );
-      band_size = ( count + num_bands - 1 ) / num_bands;
+      n       = ( height + n - 1 ) / n;
+      height  = ( height + n - 1 ) / n;
     }
 
-    min   = ras.min_ey;
-    max_y = ras.max_ey;
+    /* memory management */
+    n = ( height * sizeof ( PCell ) + sizeof ( TCell ) - 1 ) / sizeof ( TCell );
+
+    ras.cells     = buffer + n;
+    ras.max_cells = (FT_PtrDist)( FT_MAX_GRAY_POOL - n );
+    ras.ycells    = (PCell*)buffer;
 
-    for ( ; min < max_y; min = max )
+    for ( y = yMin; y < yMax; )
     {
-      max = min + band_size;
-      if ( max > max_y )
-        max = max_y;
+      ras.min_ey = y;
+      y         += height;
+      ras.max_ey = FT_MIN( y, yMax );
 
       band    = bands;
-      band[1] = min;
-      band[0] = max;
+      band[1] = xMin;
+      band[0] = xMax;
 
       do
       {
@@ -1765,27 +1783,12 @@ typedef ptrdiff_t  FT_PtrDist;
         int     error;
 
 
-        /* memory management */
-        {
-          size_t  ycount = (size_t)width;
-          size_t  cell_start;
-
-
-          cell_start = ( ycount * sizeof ( PCell ) + sizeof ( TCell ) - 1 ) /
-                       sizeof ( TCell );
-
-          ras.cells     = buffer + cell_start;
-          ras.max_cells = (FT_PtrDist)( FT_MAX_GRAY_POOL - cell_start );
-          ras.num_cells = 0;
-
-          ras.ycells = (PCell*)buffer;
-          while ( ycount )
-            ras.ycells[--ycount] = NULL;
-        }
+        FT_MEM_ZERO( ras.ycells, height * sizeof ( PCell ) );
 
+        ras.num_cells = 0;
         ras.invalid   = 1;
-        ras.min_ey    = band[1];
-        ras.max_ey    = band[0];
+        ras.min_ex    = band[1];
+        ras.max_ex    = band[0];
 
         error = gray_convert_glyph_inner( RAS_VAR );
 
@@ -1801,8 +1804,7 @@ typedef ptrdiff_t  FT_PtrDist;
         /* render pool overflow; we will reduce the render band by half */
         width >>= 1;
 
-        /* This is too complex for a single scanline; there must */
-        /* be some problems.                                     */
+        /* this should never happen even with tiny rendering pool */
         if ( width == 0 )
         {
           FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" ));
index a5447da..9e11ca6 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType smooth renderer declaration                                 */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index a528c61..226dc1b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    smooth renderer error codes (specification only).                    */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 435854e..ef176bd 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Anti-aliasing renderer interface (body).                             */
 /*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
+/*  Copyright 2000-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
   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 );
+    render->clazz->raster_class->raster_reset( render->raster, NULL, 0 );
 
     return 0;
   }
                             const FT_Vector*  origin,
                             FT_Render_Mode    required_mode )
   {
-    FT_Error     error;
+    FT_Error     error   = FT_Err_Ok;
     FT_Outline*  outline = &slot->outline;
     FT_Bitmap*   bitmap  = &slot->bitmap;
     FT_Memory    memory  = render->root.memory;
-    FT_BBox      cbox;
     FT_Pos       x_shift = 0;
     FT_Pos       y_shift = 0;
-    FT_Pos       x_left, y_top;
-    FT_Pos       width, height, pitch;
-#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-    FT_Pos       height_org, width_org;
-#endif
     FT_Int       hmul    = ( mode == FT_RENDER_MODE_LCD );
     FT_Int       vmul    = ( mode == FT_RENDER_MODE_LCD_V );
 
     FT_Raster_Params  params;
 
-    FT_Bool  have_outline_shifted = FALSE;
-    FT_Bool  have_buffer          = FALSE;
-
-#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-
-    FT_Int                   lcd_extra          = 0;
-    FT_LcdFiveTapFilter      lcd_weights        = { 0 };
-    FT_Bool                  have_custom_weight = FALSE;
-    FT_Bitmap_LcdFilterFunc  lcd_filter_func    = NULL;
-
-
-    if ( slot->face )
-    {
-      FT_Char  i;
-
-
-      for ( i = 0; i < FT_LCD_FILTER_FIVE_TAPS; i++ )
-        if ( slot->face->internal->lcd_weights[i] != 0 )
-        {
-          have_custom_weight = TRUE;
-          break;
-        }
-    }
-
-    /*
-     * The LCD filter can be set library-wide and per-face.  Face overrides
-     * library.  If the face filter weights are all zero (the default), it
-     * means that the library default should be used.
-     */
-    if ( have_custom_weight )
-    {
-      /*
-       * A per-font filter is set.  It always uses the default 5-tap
-       * in-place FIR filter that needs 2 extra pixels.
-       */
-      ft_memcpy( lcd_weights,
-                 slot->face->internal->lcd_weights,
-                 FT_LCD_FILTER_FIVE_TAPS );
-      lcd_filter_func = ft_lcd_filter_fir;
-      lcd_extra       = 2;
-    }
-    else
-    {
-      /*
-       * The face's lcd_weights is {0, 0, 0, 0, 0}, meaning `use library
-       * default'.  If the library is set to use no LCD filtering
-       * (lcd_filter_func == NULL), `lcd_filter_func' here is also set to
-       * NULL and the tests further below pass over the filtering process.
-       */
-      ft_memcpy( lcd_weights,
-                 slot->library->lcd_weights,
-                 FT_LCD_FILTER_FIVE_TAPS );
-      lcd_filter_func = slot->library->lcd_filter_func;
-      lcd_extra       = slot->library->lcd_extra;
-    }
-
-#endif /*FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
 
     /* check glyph image format */
     if ( slot->format != render->glyph_format )
       goto Exit;
     }
 
-    if ( origin )
-    {
-      x_shift = origin->x;
-      y_shift = origin->y;
-    }
-
-    /* compute the control box, and grid fit it */
-    /* taking into account the origin shift     */
-    FT_Outline_Get_CBox( outline, &cbox );
-
-    cbox.xMin = FT_PIX_FLOOR( cbox.xMin + x_shift );
-    cbox.yMin = FT_PIX_FLOOR( cbox.yMin + y_shift );
-    cbox.xMax = FT_PIX_CEIL( cbox.xMax + x_shift );
-    cbox.yMax = FT_PIX_CEIL( cbox.yMax + y_shift );
-
-    x_shift -= cbox.xMin;
-    y_shift -= cbox.yMin;
-
-    x_left  = cbox.xMin >> 6;
-    y_top   = cbox.yMax >> 6;
-
-    width  = (FT_ULong)( cbox.xMax - cbox.xMin ) >> 6;
-    height = (FT_ULong)( cbox.yMax - cbox.yMin ) >> 6;
-
-#ifndef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-    width_org  = width;
-    height_org = height;
-#endif
-
-    pitch = width;
-    if ( hmul )
-    {
-      width *= 3;
-      pitch  = FT_PAD_CEIL( width, 4 );
-    }
-
-    if ( vmul )
-      height *= 3;
-
-#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-    if ( lcd_filter_func )
-    {
-      if ( hmul )
-      {
-        x_shift += 64 * ( lcd_extra >> 1 );
-        x_left  -= lcd_extra >> 1;
-        width   += 3 * lcd_extra;
-        pitch    = FT_PAD_CEIL( width, 4 );
-      }
-
-      if ( vmul )
-      {
-        y_shift += 64 * ( lcd_extra >> 1 );
-        y_top   += lcd_extra >> 1;
-        height  += 3 * lcd_extra;
-      }
-    }
-#endif
-
-    /*
-     * 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 ||
-         x_left < FT_INT_MIN || y_top < FT_INT_MIN )
-    {
-      error = FT_THROW( Invalid_Pixel_Size );
-      goto Exit;
-    }
-
-    /* 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 ));
-      error = FT_THROW( Raster_Overflow );
-      goto Exit;
-    }
-
     /* release old bitmap buffer */
     if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
     {
       slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
     }
 
+    ft_glyphslot_preset_bitmap( slot, mode, origin );
+
     /* allocate new one */
-    if ( FT_ALLOC( bitmap->buffer, (FT_ULong)( pitch * height ) ) )
+    if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, bitmap->pitch ) )
       goto Exit;
-    else
-      have_buffer = TRUE;
 
     slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
 
-    slot->format      = FT_GLYPH_FORMAT_BITMAP;
-    slot->bitmap_left = (FT_Int)x_left;
-    slot->bitmap_top  = (FT_Int)y_top;
+    x_shift = 64 * -slot->bitmap_left;
+    y_shift = 64 * -slot->bitmap_top;
+    if ( bitmap->pixel_mode == FT_PIXEL_MODE_LCD_V )
+      y_shift += 64 * (FT_Int)bitmap->rows / 3;
+    else
+      y_shift += 64 * (FT_Int)bitmap->rows;
 
-    bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
-    bitmap->num_grays  = 256;
-    bitmap->width      = (unsigned int)width;
-    bitmap->rows       = (unsigned int)height;
-    bitmap->pitch      = pitch;
+    if ( origin )
+    {
+      x_shift += origin->x;
+      y_shift += origin->y;
+    }
 
     /* translate outline to render it into the bitmap */
     if ( x_shift || y_shift )
-    {
       FT_Outline_Translate( outline, x_shift, y_shift );
-      have_outline_shifted = TRUE;
-    }
 
     /* set up parameters */
     params.target = bitmap;
     if ( error )
       goto Exit;
 
-    if ( lcd_filter_func )
-      lcd_filter_func( bitmap, mode, lcd_weights );
+    /* finally apply filtering */
+    if ( hmul || vmul )
+    {
+      FT_Byte*                 lcd_weights;
+      FT_Bitmap_LcdFilterFunc  lcd_filter_func;
 
-#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
 
-    /* render outline into bitmap */
-    error = render->raster_render( render->raster, &params );
-    if ( error )
-      goto Exit;
+      /* Per-face LCD filtering takes priority if set up. */
+      if ( slot->face && slot->face->internal->lcd_filter_func )
+      {
+        lcd_weights     = slot->face->internal->lcd_weights;
+        lcd_filter_func = slot->face->internal->lcd_filter_func;
+      }
+      else
+      {
+        lcd_weights     = slot->library->lcd_weights;
+        lcd_filter_func = slot->library->lcd_filter_func;
+      }
+
+      if ( lcd_filter_func )
+        lcd_filter_func( bitmap, mode, lcd_weights );
+    }
+
+#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
 
-    /* expand it horizontally */
-    if ( hmul )
+    if ( hmul )  /* lcd */
     {
-      FT_Byte*  line = bitmap->buffer;
-      FT_UInt   hh;
+      FT_Byte*  line;
+      FT_Byte*  temp = NULL;
+      FT_UInt   i, j;
 
+      unsigned int  height = bitmap->rows;
+      unsigned int  width  = bitmap->width;
+      int           pitch  = bitmap->pitch;
 
-      for ( hh = height_org; hh > 0; hh--, line += pitch )
-      {
-        FT_UInt   xx;
-        FT_Byte*  end = line + width;
 
+      /* Render 3 separate monochrome bitmaps, shifting the outline  */
+      /* by 1/3 pixel.                                               */
+      width /= 3;
 
-        for ( xx = width_org; xx > 0; xx-- )
-        {
-          FT_UInt  pixel = line[xx-1];
+      bitmap->buffer += width;
+
+      error = render->raster_render( render->raster, &params );
+      if ( error )
+        goto Exit;
+
+      FT_Outline_Translate( outline, -21, 0 );
+      x_shift        -= 21;
+      bitmap->buffer += width;
 
+      error = render->raster_render( render->raster, &params );
+      if ( error )
+        goto Exit;
 
-          end[-3] = (FT_Byte)pixel;
-          end[-2] = (FT_Byte)pixel;
-          end[-1] = (FT_Byte)pixel;
-          end    -= 3;
+      FT_Outline_Translate( outline,  42, 0 );
+      x_shift        += 42;
+      bitmap->buffer -= 2 * width;
+
+      error = render->raster_render( render->raster, &params );
+      if ( error )
+        goto Exit;
+
+      /* XXX: Rearrange the bytes according to FT_PIXEL_MODE_LCD.    */
+      /* XXX: It is more efficient to render every third byte above. */
+
+      if ( FT_ALLOC( temp, (FT_ULong)pitch ) )
+        goto Exit;
+
+      for ( i = 0; i < height; i++ )
+      {
+        line = bitmap->buffer + i * (FT_ULong)pitch;
+        for ( j = 0; j < width; j++ )
+        {
+          temp[3 * j    ] = line[j];
+          temp[3 * j + 1] = line[j + width];
+          temp[3 * j + 2] = line[j + width + width];
         }
+        FT_MEM_COPY( line, temp, pitch );
       }
-    }
 
-    /* expand it vertically */
-    if ( vmul )
+      FT_FREE( temp );
+    }
+    else if ( vmul )  /* lcd_v */
     {
-      FT_Byte*  read  = bitmap->buffer + ( height - height_org ) * pitch;
-      FT_Byte*  write = bitmap->buffer;
-      FT_UInt   hh;
+      int  pitch  = bitmap->pitch;
 
 
-      for ( hh = height_org; hh > 0; hh-- )
-      {
-        ft_memcpy( write, read, pitch );
-        write += pitch;
+      /* Render 3 separate monochrome bitmaps, shifting the outline  */
+      /* by 1/3 pixel. Triple the pitch to render on each third row. */
+      bitmap->pitch *= 3;
+      bitmap->rows  /= 3;
 
-        ft_memcpy( write, read, pitch );
-        write += pitch;
+      bitmap->buffer += pitch;
 
-        ft_memcpy( write, read, pitch );
-        write += pitch;
-        read  += pitch;
-      }
-    }
+      error = render->raster_render( render->raster, &params );
+      if ( error )
+        goto Exit;
 
-#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
+      FT_Outline_Translate( outline, 0,  21 );
+      y_shift        += 21;
+      bitmap->buffer += pitch;
+
+      error = render->raster_render( render->raster, &params );
+      if ( error )
+        goto Exit;
+
+      FT_Outline_Translate( outline, 0, -42 );
+      y_shift        -= 42;
+      bitmap->buffer -= 2 * pitch;
 
-    /* everything is fine; don't deallocate buffer */
-    have_buffer = FALSE;
+      error = render->raster_render( render->raster, &params );
+      if ( error )
+        goto Exit;
 
-    error = FT_Err_Ok;
+      bitmap->pitch /= 3;
+      bitmap->rows  *= 3;
+    }
+    else  /* grayscale */
+      error = render->raster_render( render->raster, &params );
+
+#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
 
   Exit:
-    if ( have_outline_shifted )
-      FT_Outline_Translate( outline, -x_shift, -y_shift );
-    if ( have_buffer )
+    if ( !error )
+    {
+      /* everything is fine; the glyph is now officially a bitmap */
+      slot->format = FT_GLYPH_FORMAT_BITMAP;
+    }
+    else if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
     {
       FT_FREE( bitmap->buffer );
       slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
     }
 
+    if ( x_shift || y_shift )
+      FT_Outline_Translate( outline, -x_shift, -y_shift );
+
     return error;
   }
 
                         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;
+    return ft_smooth_render_generic( render, slot, mode, origin,
+                                     FT_RENDER_MODE_LCD );
   }
 
 
                           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;
+    return ft_smooth_render_generic( render, slot, mode, origin,
+                                     FT_RENDER_MODE_LCD_V );
   }
 
 
index 6dfd657..c76ffc5 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Anti-aliasing renderer interface (specification).                    */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index fb89be3..10f04cf 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for smooth module.   */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 9ddd1c7..80fb64c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for smooth module.   */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 804e9b1..5b8bc3b 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index dfdc9bc..f30824a 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index e0460d9..5249a89 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType anti-aliasing rasterer module component (body only).        */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 027b630..7c6f1a7 100644 (file)
@@ -5,7 +5,7 @@
 #
 # Process a blue zone character data file.
 #
-# Copyright 2013-2017 by
+# Copyright 2013-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used,
index 283d815..c9969db 100644 (file)
@@ -3,7 +3,7 @@
 #
 #    Parse comment blocks to build content blocks (library file).
 #
-#  Copyright 2002-2017 by
+#  Copyright 2002-2018 by
 #  David Turner.
 #
 #  This file is part of the FreeType project, and may only be used,
@@ -453,15 +453,32 @@ class  ContentProcessor:
         markup_lines = []
         first        = 1
 
+        margin  = -1
+        in_code = 0
+
         for line in content:
-            found = None
-            for t in re_markup_tags:
-                m = t.match( line )
+            if in_code:
+                m = re_code_end.match( line )
+                if m and len( m.group( 1 ) ) <= margin:
+                    in_code = 0
+                    margin  = -1
+            else:
+                m = re_code_start.match( line )
                 if m:
-                    found  = string.lower( m.group( 1 ) )
-                    prefix = len( m.group( 0 ) )
-                    line   = " " * prefix + line[prefix:]   # remove markup from line
-                    break
+                    in_code = 1
+                    margin  = len( m.group( 1 ) )
+
+            found = None
+
+            if not in_code:
+                for t in re_markup_tags:
+                    m = t.match( line )
+                    if m:
+                        found  = string.lower( m.group( 1 ) )
+                        prefix = len( m.group( 0 ) )
+                        # remove markup from line
+                        line   = " " * prefix + line[prefix:]
+                        break
 
             # is it the start of a new markup section ?
             if found:
index 4e25ff0..253a4d3 100644 (file)
@@ -4,7 +4,7 @@
 #
 #    Convert source code markup to HTML documentation.
 #
-#  Copyright 2002-2017 by
+#  Copyright 2002-2018 by
 #  David Turner.
 #
 #  This file is part of the FreeType project, and may only be used,
index 2745754..2708fd4 100644 (file)
@@ -3,7 +3,7 @@
 #
 #    Convert parsed content blocks to a structured document (library file).
 #
-#  Copyright 2002-2017 by
+#  Copyright 2002-2018 by
 #  David Turner.
 #
 #  This file is part of the FreeType project, and may only be used,
index 06407e1..2cd5a33 100644 (file)
@@ -3,7 +3,7 @@
 #
 #    Convert source code comments to multi-line blocks (library file).
 #
-#  Copyright 2002-2017 by
+#  Copyright 2002-2018 by
 #  David Turner.
 #
 #  This file is part of the FreeType project, and may only be used,
@@ -171,7 +171,7 @@ re_bold   = re.compile( r"\*((?:\w|-)(?:\w|'|-)*)\*(.*)" )   #  *bold*
 #
 # This regular expression code to identify an URL has been taken from
 #
-#   http://mail.python.org/pipermail/tutor/2002-September/017228.html
+#   https://mail.python.org/pipermail/tutor/2002-September/017228.html
 #
 # (with slight modifications).
 #
index 012b55e..7f5ecda 100644 (file)
@@ -3,7 +3,7 @@
 #
 #    A sub-class container of the `Formatter' class to produce HTML.
 #
-#  Copyright 2002-2017 by
+#  Copyright 2002-2018 by
 #  David Turner.
 #
 #  This file is part of the FreeType project, and may only be used,
@@ -25,7 +25,7 @@ import time
 # The following strings define 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">
+"https://www.w3.org/TR/html4/loose.dtd">
 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
index ba5b2e7..f40f167 100644 (file)
@@ -3,7 +3,7 @@
 #
 #    Auxiliary functions for the `docmaker' tool (library file).
 #
-#  Copyright 2002-2017 by
+#  Copyright 2002-2018 by
 #  David Turner.
 #
 #  This file is part of the FreeType project, and may only be used,
index 53f9071..09d8e9f 100644 (file)
@@ -6,7 +6,7 @@ ftfuzzer.cc
 -----------
 
 This file contains a target function  for FreeType fuzzing.  It can be
-used    with   libFuzzer    (http://llvm.org/docs/LibFuzzer.html)   or
+used   with    libFuzzer   (https://llvm.org/docs/LibFuzzer.html)   or
 potentially any other similar fuzzer.
 
 Usage:
@@ -20,7 +20,7 @@ Usage:
        -fsanitize=address,signed-integer-overflow,shift
 
      You  also need  the header  files from  the `libarchive'  library
-     (http://www.libarchive.org/)  for handling  tar  files (see  file
+     (https://www.libarchive.org/)  for handling  tar files  (see file
      `ftmutator.cc' below for more).
 
   2. Link with `libFuzzer' (it contains `main') and `libarchive'.
@@ -29,10 +29,14 @@ Usage:
 
 The exact flags and commands may vary.
 
+  https://github.com/google/oss-fuzz/tree/master/projects/freetype2
 
 There is a continuous fuzzing bot that runs ftfuzzer.
 
-  https://github.com/google/libfuzzer-bot/tree/master/freetype
+  https://oss-fuzz.com
+
+(You need an account  to be able to see coverage  reports and the like
+on oss-fuzz.com.)
 
 Check the bot configuration for the most current settings.
 
@@ -64,7 +68,7 @@ a   convenience  `main'   function.   Link   it  with   `ftfuzzer.cc',
 
 ----------------------------------------------------------------------
 
-Copyright 2015-2017 by
+Copyright 2015-2018 by
 David Turner, Robert Wilhelm, and Werner Lemberg.
 
 This  file is  part of  the FreeType  project, and  may only  be used,
index 4da0c2b..acf2bc9 100644 (file)
@@ -2,7 +2,7 @@
 //
 //   A fuzzing function to test FreeType with libFuzzer.
 //
-// Copyright 2015-2017 by
+// Copyright 2015-2018 by
 // David Turner, Robert Wilhelm, and Werner Lemberg.
 //
 // This file is part of the FreeType project, and may only be used,
@@ -43,8 +43,7 @@
 #include FT_OUTLINE_H
 #include FT_BBOX_H
 #include FT_MODULE_H
-#include FT_CFF_DRIVER_H
-#include FT_TRUETYPE_DRIVER_H
+#include FT_DRIVER_H
 #include FT_MULTIPLE_MASTERS_H
 
 
@@ -61,7 +60,7 @@
         return;
 
       // try to activate Adobe's CFF engine; it might not be the default
-      unsigned int  cff_hinting_engine = FT_CFF_HINTING_ADOBE;
+      unsigned int  cff_hinting_engine = FT_HINTING_ADOBE;
       FT_Property_Set( library,
                        "cff",
                        "hinting-engine", &cff_hinting_engine );
index 22aa5a7..ae4b140 100644 (file)
@@ -2,7 +2,7 @@
 //
 //   A custom fuzzer mutator to test for FreeType with libFuzzer.
 //
-// Copyright 2015-2017 by
+// Copyright 2015-2018 by
 // David Turner, Robert Wilhelm, and Werner Lemberg.
 //
 // This file is part of the FreeType project, and may only be used,
index ae9b1a5..c69b95e 100644 (file)
@@ -2,7 +2,7 @@
 //
 //   A fuzzing function to test FreeType's rasterizers with libFuzzer.
 //
-// Copyright 2016-2017 by
+// Copyright 2016-2018 by
 // David Turner, Robert Wilhelm, and Werner Lemberg.
 //
 // This file is part of the FreeType project, and may only be used,
index 1526120..2b02f57 100644 (file)
@@ -2,7 +2,7 @@
 //
 //   A `main' function for fuzzers like `ftfuzzer.cc'.
 //
-// Copyright 2015-2017 by
+// Copyright 2015-2018 by
 // David Turner, Robert Wilhelm, and Werner Lemberg.
 //
 // This file is part of the FreeType project, and may only be used,
index 9ed1588..b048d29 100644 (file)
@@ -6,7 +6,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
@@ -151,7 +151,7 @@ mac_standard_names = \
 # 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  .
+#   https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5176.CFF.pdf  .
 #
 sid_standard_names = \
 [
@@ -4920,7 +4920,7 @@ class StringTable:
 
   def dump( self, file ):
     write = file.write
-    write( "#ifndef  DEFINE_PS_TABLES\n" )
+    write( "#ifndef  DEFINE_PS_TABLES_DATA\n" )
     write( "#ifdef  __cplusplus\n" )
     write( '  extern "C"\n' )
     write( "#else\n" )
@@ -4929,7 +4929,7 @@ class StringTable:
     write( "#endif\n" )
     write( "  const char  " + self.master_table +
            "[" + repr( self.total ) + "]\n" )
-    write( "#ifdef  DEFINE_PS_TABLES\n" )
+    write( "#ifdef  DEFINE_PS_TABLES_DATA\n" )
     write( "  =\n" )
     write( "  {\n" )
 
@@ -4941,7 +4941,7 @@ class StringTable:
 
     write( line )
     write( "  }\n" )
-    write( "#endif /* DEFINE_PS_TABLES */\n" )
+    write( "#endif /* DEFINE_PS_TABLES_DATA */\n" )
     write( "  ;\n\n\n" )
 
   def dump_sublist( self, file, table_name, macro_name, sublist ):
@@ -4950,7 +4950,7 @@ class StringTable:
 
     write( "  /* Values are offsets into the `" +
            self.master_table + "' table */\n\n" )
-    write( "#ifndef  DEFINE_PS_TABLES\n" )
+    write( "#ifndef  DEFINE_PS_TABLES_DATA\n" )
     write( "#ifdef  __cplusplus\n" )
     write( '  extern "C"\n' )
     write( "#else\n" )
@@ -4959,7 +4959,7 @@ class StringTable:
     write( "#endif\n" )
     write( "  const short  " + table_name +
            "[" + macro_name + "]\n" )
-    write( "#ifdef  DEFINE_PS_TABLES\n" )
+    write( "#ifdef  DEFINE_PS_TABLES_DATA\n" )
     write( "  =\n" )
     write( "  {\n" )
 
@@ -4979,7 +4979,7 @@ class StringTable:
     write( line )
     write( "\n" )
     write( "  }\n" )
-    write( "#endif /* DEFINE_PS_TABLES */\n" )
+    write( "#endif /* DEFINE_PS_TABLES_DATA */\n" )
     write( "  ;\n\n\n" )
 
 
@@ -5213,7 +5213,7 @@ def dump_encoding( file, encoding_name, encoding_list ):
 
   write = file.write
   write( "  /* the following are indices into the SID name table */\n" )
-  write( "#ifndef  DEFINE_PS_TABLES\n" )
+  write( "#ifndef  DEFINE_PS_TABLES_DATA\n" )
   write( "#ifdef  __cplusplus\n" )
   write( '  extern "C"\n' )
   write( "#else\n" )
@@ -5222,7 +5222,7 @@ def dump_encoding( file, encoding_name, encoding_list ):
   write( "#endif\n" )
   write( "  const unsigned short  " + encoding_name +
          "[" + repr( len( encoding_list ) ) + "]\n" )
-  write( "#ifdef  DEFINE_PS_TABLES\n" )
+  write( "#ifdef  DEFINE_PS_TABLES_DATA\n" )
   write( "  =\n" )
   write( "  {\n" )
 
@@ -5241,14 +5241,14 @@ def dump_encoding( file, encoding_name, encoding_list ):
   write( line )
   write( "\n" )
   write( "  }\n" )
-  write( "#endif /* DEFINE_PS_TABLES */\n" )
+  write( "#endif /* DEFINE_PS_TABLES_DATA */\n" )
   write( "  ;\n\n\n" )
 
 
 def dump_array( the_array, write, array_name ):
   """dumps a given encoding"""
 
-  write( "#ifndef  DEFINE_PS_TABLES\n" )
+  write( "#ifndef  DEFINE_PS_TABLES_DATA\n" )
   write( "#ifdef  __cplusplus\n" )
   write( '  extern "C"\n' )
   write( "#else\n" )
@@ -5257,7 +5257,7 @@ def dump_array( the_array, write, array_name ):
   write( "#endif\n" )
   write( "  const unsigned char  " + array_name +
          "[" + repr( len( the_array ) ) + "L]\n" )
-  write( "#ifdef  DEFINE_PS_TABLES\n" )
+  write( "#ifdef  DEFINE_PS_TABLES_DATA\n" )
   write( "  =\n" )
   write( "  {\n" )
 
@@ -5282,7 +5282,7 @@ def dump_array( the_array, write, array_name ):
   write( line )
   write( "\n" )
   write( "  }\n" )
-  write( "#endif /* DEFINE_PS_TABLES */\n" )
+  write( "#endif /* DEFINE_PS_TABLES_DATA */\n" )
   write( "  ;\n\n\n" )
 
 
@@ -5293,7 +5293,7 @@ def main():
     print __doc__ % sys.argv[0]
     sys.exit( 1 )
 
-  file  = open( sys.argv[1], "w\n" )
+  file  = open( sys.argv[1], "wb" )
   write = file.write
 
   count_sid = len( sid_standard_names )
@@ -5318,7 +5318,7 @@ def main():
   write( "/*                                                                         */\n" )
   write( "/*    PostScript glyph names.                                              */\n" )
   write( "/*                                                                         */\n" )
-  write( "/*  Copyright 2005-2017 by                                                 */\n" )
+  write( "/*  Copyright 2005-2018 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" )
index 4b04bfc..934f11c 100755 (executable)
@@ -2,7 +2,7 @@ eval '(exit $?0)' && eval 'exec perl -wS -i "$0" ${1+"$@"}'
   & eval 'exec perl -wS -i "$0" $argv:q'
     if 0;
 
-# Copyright 2015-2017 by
+# Copyright 2015-2018 by
 # Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 22d406c..e321fba 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/truetype Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 563c584..16bc9c8 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index ad3d007..e16113f 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 301b82a..4843709 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType TrueType driver component (body only).                      */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index a1653b2..820cafb 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType font driver implementation (body).                          */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -31,7 +31,7 @@
 #include FT_SERVICE_TRUETYPE_ENGINE_H
 #include FT_SERVICE_TRUETYPE_GLYF_H
 #include FT_SERVICE_PROPERTIES_H
-#include FT_TRUETYPE_DRIVER_H
+#include FT_DRIVER_H
 
 #include "ttdriver.h"
 #include "ttgload.h"
     {
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
       /* no fast retrieval for blended MM fonts without VVAR table */
-      if ( !face->is_default_instance                               &&
-           !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
+      if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) &&
+           !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE )        )
         return FT_THROW( Unimplemented_Feature );
 #endif
 
     {
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
       /* no fast retrieval for blended MM fonts without HVAR table */
-      if ( !face->is_default_instance                               &&
-           !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
+      if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) &&
+           !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE )        )
         return FT_THROW( Unimplemented_Feature );
 #endif
 
     (FT_Get_MM_Var_Func)    TT_Get_MM_Var,          /* get_mm_var     */
     (FT_Set_Var_Design_Func)TT_Set_Var_Design,      /* set_var_design */
     (FT_Get_Var_Design_Func)TT_Get_Var_Design,      /* get_var_design */
+    (FT_Set_Instance_Func)  TT_Set_Named_Instance,  /* set_instance   */
 
     (FT_Get_Var_Blend_Func) tt_get_var_blend,       /* get_var_blend  */
     (FT_Done_Blend_Func)    tt_done_blend           /* done_blend     */
index 3bcba7f..707aa68 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level TrueType driver interface (specification).                */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index a49f205..88bca3a 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType error codes (specification only).                           */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index b7a844a..32ed34a 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType Glyph Loader (body).                                        */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -24,7 +24,7 @@
 #include FT_INTERNAL_SFNT_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_OUTLINE_H
-#include FT_TRUETYPE_DRIVER_H
+#include FT_DRIVER_H
 #include FT_LIST_H
 
 #include "ttgload.h"
@@ -87,7 +87,7 @@
   /*************************************************************************/
   /*                                                                       */
   /* Return the vertical metrics in font units for a given glyph.          */
-  /* See macro `TT_LOADER_SET_PP' below for explanations.                  */
+  /* See function `tt_loader_set_pp' below for explanations.               */
   /*                                                                       */
   FT_LOCAL_DEF( void )
   TT_Get_VMetrics( TT_Face     face,
     } while ( subglyph->flags & MORE_COMPONENTS );
 
     gloader->current.num_subglyphs = num_subglyphs;
-    FT_TRACE5(( "  %d components\n", num_subglyphs ));
+    FT_TRACE5(( "  %d component%s\n",
+                num_subglyphs,
+                num_subglyphs > 1 ? "s" : "" ));
+
+#ifdef FT_DEBUG_LEVEL_TRACE
+    {
+      FT_UInt  i;
+
+
+      subglyph = gloader->current.subglyphs;
+
+      for ( i = 0; i < num_subglyphs; i++ )
+      {
+        if ( num_subglyphs > 1 )
+          FT_TRACE7(( "    subglyph %d:\n", i ));
+
+        FT_TRACE7(( "      glyph index: %d\n", subglyph->index ));
+
+        if ( subglyph->flags & ARGS_ARE_XY_VALUES )
+          FT_TRACE7(( "      offset: x=%d, y=%d\n",
+                      subglyph->arg1,
+                      subglyph->arg2 ));
+        else
+          FT_TRACE7(( "      matching points: base=%d, component=%d\n",
+                      subglyph->arg1,
+                      subglyph->arg2 ));
+
+        if ( subglyph->flags & WE_HAVE_A_SCALE )
+          FT_TRACE7(( "      scaling: %f\n",
+                      subglyph->transform.xx / 65536.0 ));
+        else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )
+          FT_TRACE7(( "      scaling: x=%f, y=%f\n",
+                      subglyph->transform.xx / 65536.0,
+                      subglyph->transform.yy / 65536.0 ));
+        else if ( subglyph->flags & WE_HAVE_A_2X2 )
+          FT_TRACE7(( "      scaling: xx=%f, yx=%f\n"
+                      "               xy=%f, yy=%f\n",
+                      subglyph->transform.xx / 65536.0,
+                      subglyph->transform.yx / 65536.0,
+                      subglyph->transform.xy / 65536.0,
+                      subglyph->transform.yy / 65536.0 ));
+
+        subglyph++;
+      }
+    }
+#endif /* FT_DEBUG_LEVEL_TRACE */
 
 #ifdef TT_USE_BYTECODE_INTERPRETER
 
     {
       FT_TRACE1(( "TT_Hint_Glyph: too long instructions" ));
       FT_TRACE1(( " (0x%lx byte) is truncated\n",
-                 loader->glyph->control_len ));
+                  loader->glyph->control_len ));
     }
     n_ins = loader->glyph->control_len;
 
     /* compatibility mode, where no movement on the x axis means no reason */
     /* to change bearings or advance widths.                               */
     if ( !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 &&
-            !loader->exec->backward_compatibility ) )
+            loader->exec->backward_compatibility ) )
     {
 #endif
       loader->pp1 = zone->cur[zone->n_points - 4];
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 
-    if ( !loader->face->is_default_instance )
+    if ( FT_IS_NAMED_INSTANCE( FT_FACE( loader->face ) ) ||
+         FT_IS_VARIATION( FT_FACE( loader->face ) )      )
     {
       /* Deltas apply to the unscaled data. */
       error = TT_Vary_Apply_Glyph_Deltas( loader->face,
           vec->x = FT_MulFix( vec->x, x_scale );
           vec->y = FT_MulFix( vec->y, y_scale );
         }
+      }
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+      /* if we have a HVAR table, `pp1' and/or `pp2' are already adjusted */
+      if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ||
+           !IS_HINTED( loader->load_flags )                                 )
+#endif
+      {
         loader->pp1 = outline->points[n_points - 4];
         loader->pp2 = outline->points[n_points - 3];
+      }
+
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+      /* if we have a VVAR table, `pp3' and/or `pp4' are already adjusted */
+      if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ||
+           !IS_HINTED( loader->load_flags )                                 )
+#endif
+      {
         loader->pp3 = outline->points[n_points - 2];
         loader->pp4 = outline->points[n_points - 1];
       }
 
         if ( subglyph->flags & ROUND_XY_TO_GRID )
         {
-          x = FT_PIX_ROUND( x );
-          y = FT_PIX_ROUND( y );
+          TT_Face    face   = loader->face;
+          TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
+
+
+          if ( IS_HINTED( loader->load_flags ) )
+          {
+            /*
+             * We round the horizontal offset only if there is hinting along
+             * the x axis; this corresponds to integer advance width values.
+             *
+             * Theoretically, a glyph's bytecode can toggle ClearType's
+             * `backward compatibility' mode, which would allow modification
+             * of the advance width.  In reality, however, applications
+             * neither allow nor expect modified advance widths if sub-pixel
+             * rendering is active.
+             *
+             */
+            if ( driver->interpreter_version == TT_INTERPRETER_VERSION_35 )
+              x = FT_PIX_ROUND( x );
+
+            y = FT_PIX_ROUND( y );
+          }
         }
       }
     }
     TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( loader->face );
 #endif
 
+
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
     {
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 
-      if ( !loader->face->is_default_instance )
+      if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ||
+           FT_IS_VARIATION( FT_FACE( face ) )      )
       {
         /* a small outline structure with four elements for */
         /* communication with `TT_Vary_Apply_Glyph_Deltas'  */
     /***********************************************************************/
 
     /* otherwise, load a composite! */
-    else if ( loader->n_contours == -1 )
+    else if ( loader->n_contours < 0 )
     {
       FT_Memory  memory = face->root.memory;
 
       FT_ListNode  node, node2;
 
 
+      /* normalize the `n_contours' value */
+      loader->n_contours = -1;
+
       /*
        * We store the glyph index directly in the `node->data' pointer,
        * following the glib solution (cf. macro `GUINT_TO_POINTER') with a
       /* clear the nodes filled by sibling chains */
       node = ft_list_get_node_at( &loader->composites, recurse_count );
       for ( node2 = node; node2; node2 = node2->next )
-        node2->data = (void*)ULONG_MAX;
+        node2->data = (void*)FT_ULONG_MAX;
 
       /* check whether we already have a composite glyph with this index */
       if ( FT_List_Find( &loader->composites,
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 
-      if ( !face->is_default_instance )
+      if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ||
+           FT_IS_VARIATION( FT_FACE( face ) )      )
       {
         short        i, limit;
         FT_SubGlyph  subglyph;
         }
       }
     }
-    else
-    {
-      /* invalid composite count (negative but not -1) */
-      error = FT_THROW( Invalid_Outline );
-      goto Exit;
-    }
 
     /***********************************************************************/
     /***********************************************************************/
     }
 
     /* set glyph dimensions */
-    glyph->metrics.width  = bbox.xMax - bbox.xMin;
-    glyph->metrics.height = bbox.yMax - bbox.yMin;
+    glyph->metrics.width  = SUB_LONG( bbox.xMax, bbox.xMin );
+    glyph->metrics.height = SUB_LONG( bbox.yMax, bbox.yMin );
 
     /* Now take care of vertical metrics.  In the case where there is */
     /* no vertical information within the font (relatively common),   */
         /*       table in the font.  Otherwise, we use the     */
         /*       values defined in the horizontal header.      */
 
-        height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin,
+        height = (FT_Short)FT_DivFix( SUB_LONG( bbox.yMax,
+                                                bbox.yMin ),
                                       y_scale );
         if ( face->os2.version != 0xFFFFU )
           advance = (FT_Pos)( face->os2.sTypoAscender -
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
       if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
       {
-        subpixel_hinting_lean   = TRUE;
-        grayscale_cleartype     = !FT_BOOL( load_flags         &
-                                            FT_LOAD_TARGET_LCD     ||
-                                            load_flags           &
-                                            FT_LOAD_TARGET_LCD_V   );
-        exec->vertical_lcd_lean = FT_BOOL( load_flags           &
-                                           FT_LOAD_TARGET_LCD_V );
+        subpixel_hinting_lean =
+          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
+                   FT_RENDER_MODE_MONO               );
+        grayscale_cleartype =
+          FT_BOOL( subpixel_hinting_lean         &&
+                   !( ( load_flags         &
+                        FT_LOAD_TARGET_LCD )   ||
+                      ( load_flags           &
+                        FT_LOAD_TARGET_LCD_V ) ) );
+        exec->vertical_lcd_lean =
+          FT_BOOL( subpixel_hinting_lean    &&
+                   ( load_flags           &
+                     FT_LOAD_TARGET_LCD_V ) );
       }
       else
       {
     TT_LoaderRec  loader;
 
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-#define IS_DEFAULT_INSTANCE  ( ( (TT_Face)glyph->face )->is_default_instance )
+#define IS_DEFAULT_INSTANCE  ( !( FT_IS_NAMED_INSTANCE( glyph->face ) ||  \
+                                  FT_IS_VARIATION( glyph->face )      ) )
 #else
 #define IS_DEFAULT_INSTANCE  1
 #endif
          IS_DEFAULT_INSTANCE                     )
     {
       error = load_sbit_image( size, glyph, glyph_index, load_flags );
-      if ( !error )
+      if ( FT_ERR_EQ( error, Missing_Bitmap ) )
+      {
+        /* the bitmap strike is incomplete and misses the requested glyph; */
+        /* if we have a bitmap-only font, return an empty glyph            */
+        if ( !FT_IS_SCALABLE( glyph->face ) )
+        {
+          TT_Face    face = (TT_Face)glyph->face;
+          FT_Short   left_bearing = 0, top_bearing = 0;
+          FT_UShort  advance_width = 0, advance_height = 0;
+
+
+          /* to return an empty glyph, however, we need metrics data   */
+          /* from the `hmtx' (or `vmtx') table; the assumption is that */
+          /* empty glyphs are missing intentionally, representing      */
+          /* whitespace - not having at least horizontal metrics is    */
+          /* thus considered an error                                  */
+          if ( !face->horz_metrics_size )
+            return error;
+
+          /* we now construct an empty bitmap glyph */
+          TT_Get_HMetrics( face, glyph_index,
+                           &left_bearing,
+                           &advance_width );
+          TT_Get_VMetrics( face, glyph_index,
+                           0,
+                           &top_bearing,
+                           &advance_height );
+
+          glyph->outline.n_points   = 0;
+          glyph->outline.n_contours = 0;
+
+          glyph->metrics.width  = 0;
+          glyph->metrics.height = 0;
+
+          glyph->metrics.horiBearingX = left_bearing;
+          glyph->metrics.horiBearingY = 0;
+          glyph->metrics.horiAdvance  = advance_width;
+
+          glyph->metrics.vertBearingX = 0;
+          glyph->metrics.vertBearingY = top_bearing;
+          glyph->metrics.vertAdvance  = advance_height;
+
+          glyph->format            = FT_GLYPH_FORMAT_BITMAP;
+          glyph->bitmap.pixel_mode = FT_PIXEL_MODE_MONO;
+
+          glyph->bitmap_left = 0;
+          glyph->bitmap_top  = 0;
+
+          return FT_Err_Ok;
+        }
+      }
+      else if ( error )
+      {
+        /* return error if font is not scalable */
+        if ( !FT_IS_SCALABLE( glyph->face ) )
+          return error;
+      }
+      else
       {
         if ( FT_IS_SCALABLE( glyph->face ) )
         {
index 1dd6c84..d237cfd 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType Glyph Loader (specification).                               */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 0cedb6b..6f456cf 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType GX Font Variation loader                                    */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.     */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 
 #define FT_Stream_FTell( stream )                         \
           (FT_ULong)( (stream)->cursor - (stream)->base )
-#define FT_Stream_SeekSet( stream, off )                  \
-          ( (stream)->cursor = (stream)->base + (off) )
+#define FT_Stream_SeekSet( stream, off )                               \
+          (stream)->cursor =                                           \
+            ( (off) < (FT_ULong)( (stream)->limit - (stream)->base ) ) \
+                        ? (stream)->base + (off)                       \
+                        : (stream)->limit
 
 
   /*************************************************************************/
 
 
   /* some macros we need */
-  #define FT_FIXED_ONE  ( (FT_Fixed)0x10000 )
+#define FT_FIXED_ONE  ( (FT_Fixed)0x10000 )
 
-  #define FT_fdot14ToFixed( x )                \
-          ( (FT_Fixed)( (FT_ULong)(x) << 2 ) )
-  #define FT_intToFixed( i )                    \
-          ( (FT_Fixed)( (FT_ULong)(i) << 16 ) )
-  #define FT_fixedToInt( x )                                   \
-          ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )
+#define FT_fdot14ToFixed( x )                \
+        ( (FT_Fixed)( (FT_ULong)(x) << 2 ) )
+#define FT_intToFixed( i )                    \
+        ( (FT_Fixed)( (FT_ULong)(i) << 16 ) )
+#define FT_fixedToInt( x )                                   \
+        ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )
 
 
   static FT_Error
                                    outerIndex,
                                    innerIndex );
 
-    FT_TRACE5(( "%s value %d adjusted by %d units (%s)\n",
+    FT_TRACE5(( "%s value %d adjusted by %d unit%s (%s)\n",
                 vertical ? "vertical height" : "horizontal width",
                 *avalue,
                 delta,
+                delta == 1 ? "" : "s",
                 vertical ? "VVAR" : "HVAR" ));
 
     *avalue += delta;
 
       if ( p )
       {
-        FT_TRACE5(( "value %c%c%c%c (%d units) adjusted by %d units (MVAR)\n",
+        FT_TRACE5(( "value %c%c%c%c (%d unit%s) adjusted by %d unit%s (MVAR)\n",
                     (FT_Char)( value->tag >> 24 ),
                     (FT_Char)( value->tag >> 16 ),
                     (FT_Char)( value->tag >> 8 ),
                     (FT_Char)( value->tag ),
                     value->unmodified,
-                    delta ));
+                    value->unmodified == 1 ? "" : "s",
+                    delta,
+                    delta == 1 ? "" : "s" ));
 
         /* since we handle both signed and unsigned values as FT_Short, */
         /* ensure proper overflow arithmetic                            */
     blend->gv_glyphcnt = gvar_head.glyphCount;
     offsetToData       = gvar_start + gvar_head.offsetToData;
 
-    FT_TRACE5(( "gvar: there are %d shared coordinates:\n",
-                blend->tuplecount ));
+    FT_TRACE5(( "gvar: there %s %d shared coordinate%s:\n",
+                blend->tuplecount == 1 ? "is" : "are",
+                blend->tuplecount,
+                blend->tuplecount == 1 ? "" : "s" ));
 
     if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) )
       goto Exit;
     /* 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.   */
 
-    FT_TRACE5(( "design coordinates:\n" ));
+    FT_TRACE5(( "%d design coordinate%s:\n",
+                num_coords,
+                num_coords == 1 ? "" : "s" ));
 
     a = mmvar->axis;
     for ( i = 0; i < num_coords; i++, a++ )
           a->minimum / 65536.0,
           a->maximum / 65536.0 ));
 
-        if ( coord > a->maximum)
+        if ( coord > a->maximum )
           coord = a->maximum;
         else
           coord = a->minimum;
       }
 
       if ( coord < a->def )
-        normalized[i] = -FT_DivFix( coords[i] - a->def,
+        normalized[i] = -FT_DivFix( coord - a->def,
                                     a->minimum - a->def );
       else if ( coord > a->def )
-        normalized[i] = FT_DivFix( coords[i] - a->def,
+        normalized[i] = FT_DivFix( coord - a->def,
                                    a->maximum - a->def );
       else
         normalized[i] = 0;
       nc = blend->num_axis;
     }
 
-    if ( face->doblend )
-    {
-      for ( i = 0; i < nc; i++ )
-        design[i] = coords[i];
-    }
-    else
-    {
-      for ( i = 0; i < nc; i++ )
-        design[i] = 0;
-    }
+    for ( i = 0; i < nc; i++ )
+      design[i] = coords[i];
 
     for ( ; i < num_coords; i++ )
       design[i] = 0;
   TT_Get_MM_Var( TT_Face      face,
                  FT_MM_Var*  *master )
   {
-    FT_Stream            stream = face->root.stream;
-    FT_Memory            memory = face->root.memory;
+    FT_Stream            stream     = face->root.stream;
+    FT_Memory            memory     = face->root.memory;
     FT_ULong             table_len;
-    FT_Error             error  = FT_Err_Ok;
-    FT_ULong             fvar_start;
+    FT_Error             error      = FT_Err_Ok;
+    FT_ULong             fvar_start = 0;
     FT_UInt              i, j;
     FT_MM_Var*           mmvar = NULL;
     FT_Fixed*            next_coords;
     FT_Fixed*            c;
     FT_Var_Named_Style*  ns;
     GX_FVar_Head         fvar_head;
-    FT_Bool              usePsName;
+    FT_Bool              usePsName  = 0;
     FT_UInt              num_instances;
+    FT_UInt              num_axes;
+    FT_UShort*           axis_flags;
+
+    FT_Offset  mmvar_size;
+    FT_Offset  axis_flags_size;
+    FT_Offset  axis_size;
+    FT_Offset  namedstyle_size;
+    FT_Offset  next_coords_size;
+    FT_Offset  next_name_size;
+
+    FT_Bool  need_init;
 
     static const FT_Frame_Field  fvar_fields[] =
     {
     /* read the font data and set up the internal representation */
     /* if not already done                                       */
 
-    if ( !face->blend )
+    need_init = !face->blend;
+
+    if ( need_init )
     {
       FT_TRACE2(( "FVAR " ));
 
       if ( FT_NEW( face->blend ) )
         goto Exit;
 
-      /* `num_instances' holds the number of all named instances, */
-      /* including the default instance which might be missing    */
-      /* in fvar's table of named instances                       */
-      num_instances = face->root.style_flags >> 16;
-
-      /* cannot overflow 32-bit arithmetic because of the size limits */
-      /* used in the `fvar' table validity check in `sfnt_init_face'  */
-      face->blend->mmvar_len =
-        sizeof ( FT_MM_Var ) +
-        fvar_head.axisCount * sizeof ( FT_Var_Axis ) +
-        num_instances * sizeof ( FT_Var_Named_Style ) +
-        num_instances * fvar_head.axisCount * sizeof ( FT_Fixed ) +
-        5 * fvar_head.axisCount;
+      num_axes = fvar_head.axisCount;
+    }
+    else
+      num_axes = face->blend->num_axis;
+
+    /* `num_instances' holds the number of all named instances, */
+    /* including the default instance which might be missing    */
+    /* in fvar's table of named instances                       */
+    num_instances = (FT_UInt)face->root.style_flags >> 16;
+
+    /* prepare storage area for MM data; this cannot overflow   */
+    /* 32-bit arithmetic because of the size limits used in the */
+    /* `fvar' table validity check in `sfnt_init_face'          */
+
+    /* the various `*_size' variables, which we also use as     */
+    /* offsets into the `mmlen' array, must be multiples of the */
+    /* pointer size (except the last one); without such an      */
+    /* alignment there might be runtime errors due to           */
+    /* misaligned addresses                                     */
+#undef  ALIGN_SIZE
+#define ALIGN_SIZE( n ) \
+          ( ( (n) + sizeof (void*) - 1 ) & ~( sizeof (void*) - 1 ) )
+
+    mmvar_size       = ALIGN_SIZE( sizeof ( FT_MM_Var ) );
+    axis_flags_size  = ALIGN_SIZE( num_axes *
+                                   sizeof ( FT_UShort ) );
+    axis_size        = ALIGN_SIZE( num_axes *
+                                   sizeof ( FT_Var_Axis ) );
+    namedstyle_size  = ALIGN_SIZE( num_instances *
+                                   sizeof ( FT_Var_Named_Style ) );
+    next_coords_size = ALIGN_SIZE( num_instances *
+                                   num_axes *
+                                   sizeof ( FT_Fixed ) );
+    next_name_size   = num_axes * 5;
+
+    if ( need_init )
+    {
+      face->blend->mmvar_len = mmvar_size       +
+                               axis_flags_size  +
+                               axis_size        +
+                               namedstyle_size  +
+                               next_coords_size +
+                               next_name_size;
 
       if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )
         goto Exit;
       /* the data gets filled in later on                    */
 
       mmvar->num_axis =
-        fvar_head.axisCount;
+        num_axes;
       mmvar->num_designs =
         ~0U;                   /* meaningless in this context; each glyph */
                                /* may have a different number of designs  */
                                /* (or tuples, as called by Apple)         */
       mmvar->num_namedstyles =
         num_instances;
+
+      /* alas, no public field in `FT_Var_Axis' for axis flags */
+      axis_flags =
+        (FT_UShort*)( (char*)mmvar + mmvar_size );
       mmvar->axis =
-        (FT_Var_Axis*)&( mmvar[1] );
+        (FT_Var_Axis*)( (char*)axis_flags + axis_flags_size );
       mmvar->namedstyle =
-        (FT_Var_Named_Style*)&( mmvar->axis[fvar_head.axisCount] );
+        (FT_Var_Named_Style*)( (char*)mmvar->axis + axis_size );
 
-      next_coords =
-        (FT_Fixed*)&( mmvar->namedstyle[num_instances] );
+      next_coords = (FT_Fixed*)( (char*)mmvar->namedstyle +
+                                 namedstyle_size );
       for ( i = 0; i < num_instances; i++ )
       {
         mmvar->namedstyle[i].coords  = next_coords;
-        next_coords                 += fvar_head.axisCount;
+        next_coords                 += num_axes;
       }
 
-      next_name = (FT_String*)next_coords;
-      for ( i = 0; i < fvar_head.axisCount; i++ )
+      next_name = (FT_String*)( (char*)mmvar->namedstyle +
+                                namedstyle_size + next_coords_size );
+      for ( i = 0; i < num_axes; i++ )
       {
         mmvar->axis[i].name  = next_name;
         next_name           += 5;
         goto Exit;
 
       a = mmvar->axis;
-      for ( i = 0; i < fvar_head.axisCount; i++ )
+      for ( i = 0; i < num_axes; i++ )
       {
         GX_FVar_Axis  axis_rec;
 
         a->name[3] = (FT_String)( ( a->tag       ) & 0xFF );
         a->name[4] = '\0';
 
+        *axis_flags = axis_rec.flags;
+
         if ( a->minimum > a->def ||
              a->def > a->maximum )
         {
           a->maximum = a->def;
         }
 
-        FT_TRACE5(( "  \"%s\": minimum=%.5f, default=%.5f, maximum=%.5f\n",
+        FT_TRACE5(( "  \"%s\":"
+                    " minimum=%.5f, default=%.5f, maximum=%.5f,"
+                    " flags=0x%04X\n",
                     a->name,
                     a->minimum / 65536.0,
                     a->def / 65536.0,
-                    a->maximum / 65536.0 ));
+                    a->maximum / 65536.0,
+                    *axis_flags ));
 
         a++;
+        axis_flags++;
       }
 
       FT_TRACE5(( "\n" ));
       /* named instance coordinates are stored as design coordinates; */
       /* we have to convert them to normalized coordinates also       */
       if ( FT_NEW_ARRAY( face->blend->normalized_stylecoords,
-                         fvar_head.axisCount * num_instances ) )
+                         num_axes * num_instances ) )
         goto Exit;
 
       if ( fvar_head.instanceCount && !face->blend->avar_loaded )
+      {
+        FT_ULong  offset = FT_STREAM_POS();
+
+
         ft_var_load_avar( face );
 
+        if ( FT_STREAM_SEEK( offset ) )
+          goto Exit;
+      }
+
       ns  = mmvar->namedstyle;
       nsc = face->blend->normalized_stylecoords;
       for ( i = 0; i < fvar_head.instanceCount; i++, ns++ )
       {
         /* PostScript names add 2 bytes to the instance record size */
         if ( FT_FRAME_ENTER( ( usePsName ? 6L : 4L ) +
-                             4L * fvar_head.axisCount ) )
+                             4L * num_axes ) )
           goto Exit;
 
         ns->strid       =    FT_GET_USHORT();
         (void) /* flags = */ FT_GET_USHORT();
 
         c = ns->coords;
-        for ( j = 0; j < fvar_head.axisCount; j++, c++ )
+        for ( j = 0; j < num_axes; j++, c++ )
           *c = FT_GET_LONG();
 
+        /* valid psid values are 6, [256;32767], and 0xFFFF */
         if ( usePsName )
           ns->psid = FT_GET_USHORT();
+        else
+          ns->psid = 0xFFFF;
 
-        ft_var_to_normalized( face,
-                              fvar_head.axisCount,
-                              ns->coords,
-                              nsc );
-        nsc += fvar_head.axisCount;
+        ft_var_to_normalized( face, num_axes, ns->coords, nsc );
+        nsc += num_axes;
 
         FT_FRAME_EXIT();
       }
         SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
 
         FT_Int   found, dummy1, dummy2;
-        FT_UInt  strid = 0xFFFFFFFFUL;
+        FT_UInt  strid = ~0U;
 
 
         /* the default instance is missing in array the   */
 
             a = mmvar->axis;
             c = ns->coords;
-            for ( j = 0; j < fvar_head.axisCount; j++, a++, c++ )
+            for ( j = 0; j < num_axes; j++, a++, c++ )
               *c = a->def;
           }
         }
         goto Exit;
       FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len );
 
+      axis_flags =
+        (FT_UShort*)( (char*)mmvar + mmvar_size );
       mmvar->axis =
-        (FT_Var_Axis*)&( mmvar[1] );
+        (FT_Var_Axis*)( (char*)axis_flags + axis_flags_size );
       mmvar->namedstyle =
-        (FT_Var_Named_Style*)&( mmvar->axis[mmvar->num_axis] );
-      next_coords =
-        (FT_Fixed*)&( mmvar->namedstyle[mmvar->num_namedstyles] );
+        (FT_Var_Named_Style*)( (char*)mmvar->axis+ axis_size );
 
+      next_coords = (FT_Fixed*)( (char*)mmvar->namedstyle +
+                                 namedstyle_size );
       for ( n = 0; n < mmvar->num_namedstyles; n++ )
       {
         mmvar->namedstyle[n].coords  = next_coords;
-        next_coords                 += mmvar->num_axis;
+        next_coords                 += num_axes;
       }
 
       a         = mmvar->axis;
-      next_name = (FT_String*)next_coords;
-      for ( n = 0; n < mmvar->num_axis; n++ )
+      next_name = (FT_String*)( (char*)mmvar->namedstyle +
+                                namedstyle_size + next_coords_size );
+      for ( n = 0; n < num_axes; n++ )
       {
         a->name = next_name;
 
     FT_Error    error = FT_Err_Ok;
     GX_Blend    blend;
     FT_MM_Var*  mmvar;
-    FT_UInt     i, j;
-    FT_Bool     is_default_instance = 1;
+    FT_UInt     i;
+
+    FT_Bool     all_design_coords = FALSE;
+
     FT_Memory   memory = face->root.memory;
 
     enum
         error = FT_THROW( Invalid_Argument );
         goto Exit;
       }
-
-      if ( coords[i] != 0 )
-        is_default_instance = 0;
     }
 
     FT_TRACE5(( "\n" ));
     {
       if ( FT_NEW_ARRAY( blend->coords, mmvar->num_axis ) )
         goto Exit;
+
+      /* the first time we have to compute all design coordinates */
+      all_design_coords = TRUE;
     }
 
     if ( !blend->normalizedcoords )
     }
     else
     {
+      FT_Bool    have_diff = 0;
+      FT_UInt    j;
+      FT_Fixed*  c;
+      FT_Fixed*  n;
+
+
       manageCvt = mcvt_retain;
 
       for ( i = 0; i < num_coords; i++ )
         if ( blend->normalizedcoords[i] != coords[i] )
         {
           manageCvt = mcvt_load;
+          have_diff = 1;
           break;
         }
       }
 
+      if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) )
+      {
+        FT_UInt  idx = (FT_UInt)face->root.face_index >> 16;
+
+
+        c = blend->normalizedcoords + i;
+        n = blend->normalized_stylecoords + idx * mmvar->num_axis + i;
+        for ( j = i; j < mmvar->num_axis; j++, n++, c++ )
+          if ( *c != *n )
+            have_diff = 1;
+      }
+      else
+      {
+        c = blend->normalizedcoords + i;
+        for ( j = i; j < mmvar->num_axis; j++, c++ )
+          if ( *c != 0 )
+            have_diff = 1;
+      }
+
+      /* return value -1 indicates `no change' */
+      if ( !have_diff )
+        return -1;
+
       for ( ; i < mmvar->num_axis; i++ )
       {
         if ( blend->normalizedcoords[i] != 0 )
 
     if ( set_design_coords )
       ft_var_to_design( face,
-                        num_coords,
+                        all_design_coords ? blend->num_axis : num_coords,
                         blend->normalizedcoords,
                         blend->coords );
 
       }
     }
 
-    /* check whether the current variation tuple coincides */
-    /* with a named instance                               */
-
-    for ( i = 0; i < blend->mmvar->num_namedstyles; i++ )
-    {
-      FT_Fixed*  nsc = blend->normalized_stylecoords + i * blend->num_axis;
-      FT_Fixed*  ns  = blend->normalizedcoords;
-
-
-      for ( j = 0; j < blend->num_axis; j++, nsc++, ns++ )
-      {
-        if ( *nsc != *ns )
-          break;
-      }
-
-      if ( j == blend->num_axis )
-        break;
-    }
-
-    /* adjust named instance index */
-    face->root.face_index &= 0xFFFF;
-    if ( i < blend->mmvar->num_namedstyles )
-      face->root.face_index |= ( i + 1 ) << 16;
-
-    face->is_default_instance = is_default_instance;
-
     /* enforce recomputation of the PostScript name; */
     FT_FREE( face->postscript_name );
     face->postscript_name = NULL;
                    FT_UInt    num_coords,
                    FT_Fixed*  coords )
   {
-    return tt_set_mm_blend( face, num_coords, coords, 1 );
+    FT_Error  error;
+
+
+    error = tt_set_mm_blend( face, num_coords, coords, 1 );
+    if ( error )
+      return error;
+
+    if ( num_coords )
+      face->root.face_flags |= FT_FACE_FLAG_VARIATION;
+    else
+      face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
+
+    return FT_Err_Ok;
   }
 
 
 
     blend = face->blend;
 
+    if ( !blend->coords )
+    {
+      /* select default instance coordinates */
+      /* if no instance is selected yet      */
+      if ( FT_SET_ERROR( tt_set_mm_blend( face, 0, NULL, 1 ) ) )
+        return error;
+    }
+
     nc = num_coords;
     if ( num_coords > blend->num_axis )
     {
     FT_UInt     i;
     FT_Memory   memory = face->root.memory;
 
-    FT_Var_Axis*  a;
-    FT_Fixed*     c;
-
+    FT_Fixed*  c;
+    FT_Fixed*  n;
     FT_Fixed*  normalized = NULL;
 
+    FT_Bool  have_diff = 0;
+
 
     if ( !face->blend )
     {
         goto Exit;
     }
 
-    FT_MEM_COPY( blend->coords,
-                 coords,
-                 num_coords * sizeof ( FT_Fixed ) );
+    c = blend->coords;
+    n = coords;
+    for ( i = 0; i < num_coords; i++, n++, c++ )
+    {
+      if ( *c != *n )
+      {
+        *c        = *n;
+        have_diff = 1;
+      }
+    }
+
+    if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) )
+    {
+      FT_UInt              instance_index;
+      FT_Var_Named_Style*  named_style;
+
 
-    a = mmvar->axis + num_coords;
-    c = coords + num_coords;
-    for ( i = num_coords; i < mmvar->num_axis; i++, a++, c++ )
-      *c = a->def;
+      instance_index = (FT_UInt)face->root.face_index >> 16;
+      named_style    = mmvar->namedstyle + instance_index - 1;
+
+      n = named_style->coords + num_coords;
+      for ( ; i < mmvar->num_axis; i++, n++, c++ )
+      {
+        if ( *c != *n )
+        {
+          *c        = *n;
+          have_diff = 1;
+        }
+      }
+    }
+    else
+    {
+      FT_Var_Axis*  a;
+
+
+      a = mmvar->axis + num_coords;
+      for ( ; i < mmvar->num_axis; i++, a++, c++ )
+      {
+        if ( *c != a->def )
+        {
+          *c        = a->def;
+          have_diff = 1;
+        }
+      }
+    }
+
+    /* return value -1 indicates `no change' */
+    if ( !have_diff )
+      return -1;
 
     if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) )
       goto Exit;
     if ( !face->blend->avar_loaded )
       ft_var_load_avar( face );
 
-    ft_var_to_normalized( face, num_coords, coords, normalized );
+    ft_var_to_normalized( face, num_coords, blend->coords, normalized );
 
     error = tt_set_mm_blend( face, mmvar->num_axis, normalized, 0 );
+    if ( error )
+      goto Exit;
+
+    if ( num_coords )
+      face->root.face_flags |= FT_FACE_FLAG_VARIATION;
+    else
+      face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
 
   Exit:
     FT_FREE( normalized );
 
     blend = face->blend;
 
+    if ( !blend->coords )
+    {
+      /* select default instance coordinates */
+      /* if no instance is selected yet      */
+      if ( FT_SET_ERROR( tt_set_mm_blend( face, 0, NULL, 1 ) ) )
+        return error;
+    }
+
     nc = num_coords;
     if ( num_coords > blend->num_axis )
     {
 
 
   /*************************************************************************/
+  /*                                                                       */
+  /* <Function>                                                            */
+  /*    TT_Set_Named_Instance                                              */
+  /*                                                                       */
+  /* <Description>                                                         */
+  /*    Set the given named instance, also resetting any further           */
+  /*    variation.                                                         */
+  /*                                                                       */
+  /* <Input>                                                               */
+  /*    face           :: A handle to the source face.                     */
+  /*                                                                       */
+  /*    instance_index :: The instance index, starting with value 1.       */
+  /*                      Value 0 indicates to not use an instance.        */
+  /*                                                                       */
+  /* <Return>                                                              */
+  /*    FreeType error code.  0~means success.                             */
+  /*                                                                       */
+  FT_LOCAL_DEF( FT_Error )
+  TT_Set_Named_Instance( TT_Face  face,
+                         FT_UInt  instance_index )
+  {
+    FT_Error    error = FT_ERR( Invalid_Argument );
+    GX_Blend    blend;
+    FT_MM_Var*  mmvar;
+
+    FT_UInt  num_instances;
+
+
+    if ( !face->blend )
+    {
+      if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) )
+        goto Exit;
+    }
+
+    blend = face->blend;
+    mmvar = blend->mmvar;
+
+    num_instances = (FT_UInt)face->root.style_flags >> 16;
+
+    /* `instance_index' starts with value 1, thus `>' */
+    if ( instance_index > num_instances )
+      goto Exit;
+
+    if ( instance_index > 0 && mmvar->namedstyle )
+    {
+      FT_Memory     memory = face->root.memory;
+      SFNT_Service  sfnt   = (SFNT_Service)face->sfnt;
+
+      FT_Var_Named_Style*  named_style;
+      FT_String*           style_name;
+
+
+      named_style = mmvar->namedstyle + instance_index - 1;
+
+      error = sfnt->get_name( face,
+                              (FT_UShort)named_style->strid,
+                              &style_name );
+      if ( error )
+        goto Exit;
+
+      /* set (or replace) style name */
+      FT_FREE( face->root.style_name );
+      face->root.style_name = style_name;
+
+      /* finally, select the named instance */
+      error = TT_Set_Var_Design( face,
+                                 mmvar->num_axis,
+                                 named_style->coords );
+      if ( error )
+        goto Exit;
+    }
+    else
+      error = TT_Set_Var_Design( face, 0, NULL );
+
+    face->root.face_index  = ( instance_index << 16 )             |
+                             ( face->root.face_index & 0xFFFFL );
+    face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
+
+  Exit:
+    return error;
+  }
+
+
+  /*************************************************************************/
   /*************************************************************************/
   /*****                                                               *****/
   /*****                     GX VAR PARSING ROUTINES                   *****/
     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_UInt     point_count, spoint_count = 0;
+    FT_UShort*  sharedpoints = NULL;
+    FT_UShort*  localpoints  = NULL;
+    FT_UShort*  points;
     FT_Short*   deltas;
 
 
 
     offsetToData += table_start;
 
-    /* The documentation implies there are flags packed into              */
-    /* `tupleCount', but John Jenkins says that shared points don't apply */
-    /* to `cvar', and no other flags are defined.                         */
+    if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS )
+    {
+      here = FT_Stream_FTell( stream );
 
-    FT_TRACE5(( "cvar: there are %d tuples:\n", tupleCount & 0xFFF ));
+      FT_Stream_SeekSet( stream, offsetToData );
+
+      sharedpoints = ft_var_readpackedpoints( stream,
+                                              table_len,
+                                              &spoint_count );
+      offsetToData = FT_Stream_FTell( stream );
+
+      FT_Stream_SeekSet( stream, here );
+    }
+
+    FT_TRACE5(( "cvar: there %s %d tuple%s:\n",
+                ( tupleCount & 0xFFF ) == 1 ? "is" : "are",
+                tupleCount & 0xFFF,
+                ( tupleCount & 0xFFF ) == 1 ? "" : "s" ));
 
     for ( i = 0; i < ( tupleCount & 0xFFF ); i++ )
     {
       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() * 4;  /* convert from        */
                                                  /* short frac to fixed */
       }
-      else
+      else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount )
       {
-        /* 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();
+        FT_TRACE2(( "tt_face_vary_cvt:"
+                    " invalid tuple index\n" ));
 
-        offsetToData += tupleDataSize;
-        continue;
+        error = FT_THROW( Invalid_Table );
+        goto Exit;
       }
+      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 )
       {
                                   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 ) )
+
+      if ( apply == 0 )              /* tuple isn't active for our blend */
       {
         offsetToData += tupleDataSize;
         continue;
 
       FT_Stream_SeekSet( stream, offsetToData );
 
-      localpoints = ft_var_readpackedpoints( stream,
-                                             table_len,
-                                             &point_count );
-      deltas      = ft_var_readpackeddeltas( stream,
-                                             table_len,
-                                             point_count == 0 ? face->cvt_size
-                                                              : point_count );
-      if ( !localpoints || !deltas )
+      if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS )
+      {
+        localpoints = ft_var_readpackedpoints( stream,
+                                               table_len,
+                                               &point_count );
+        points      = localpoints;
+      }
+      else
+      {
+        points      = sharedpoints;
+        point_count = spoint_count;
+      }
+
+      deltas = ft_var_readpackeddeltas( stream,
+                                        table_len,
+                                        point_count == 0 ? face->cvt_size
+                                                         : point_count );
+
+      if ( !points                                                        ||
+           !deltas                                                        ||
+           ( localpoints == ALL_POINTS && point_count != face->cvt_size ) )
         ; /* failure, ignore it */
 
       else if ( localpoints == ALL_POINTS )
           FT_Long  orig_cvt;
 
 
-          pindex = localpoints[j];
+          pindex = points[j];
           if ( (FT_ULong)pindex >= face->cvt_size )
             continue;
 
     FT_FRAME_EXIT();
 
   Exit:
+    if ( sharedpoints != ALL_POINTS )
+      FT_FREE( sharedpoints );
     FT_FREE( tuple_coords );
     FT_FREE( im_start_coords );
     FT_FREE( im_end_coords );
     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_Stream_SeekSet( stream, here );
     }
 
-    FT_TRACE5(( "gvar: there are %d tuples:\n",
-                tupleCount & GX_TC_TUPLE_COUNT_MASK ));
+    FT_TRACE5(( "gvar: there %s %d tuple%s:\n",
+                ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "is" : "are",
+                tupleCount & GX_TC_TUPLE_COUNT_MASK,
+                ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "" : "s" ));
 
     for ( j = 0; j < n_points; j++ )
       points_org[j] = outline->points[j];
           FT_Pos  delta_y = FT_MulFix( deltas_y[j], apply );
 
 
-          if ( j < n_points - 3 )
+          if ( j < n_points - 4 )
           {
             outline->points[j].x += delta_x;
             outline->points[j].y += delta_y;
             /* To avoid double adjustment of advance width or height, */
             /* adjust phantom points only if there is no HVAR or VVAR */
             /* support, respectively.                                 */
-            if ( j == ( n_points - 3 )          &&
-                 !( face->variation_support   &
-                    TT_FACE_FLAG_VAR_HADVANCE ) )
+            if ( j == ( n_points - 4 )        &&
+                 !( face->variation_support &
+                    TT_FACE_FLAG_VAR_LSB    ) )
+              outline->points[j].x += delta_x;
+
+            else if ( j == ( n_points - 3 )          &&
+                      !( face->variation_support   &
+                         TT_FACE_FLAG_VAR_HADVANCE ) )
               outline->points[j].x += delta_x;
 
             else if ( j == ( n_points - 2 )        &&
                       !( face->variation_support &
-                         TT_FACE_FLAG_VAR_LSB    ) )
-              outline->points[j].x += delta_x;
+                         TT_FACE_FLAG_VAR_TSB    ) )
+              outline->points[j].y += delta_y;
 
             else if ( j == ( n_points - 1 )          &&
                       !( face->variation_support   &
                          TT_FACE_FLAG_VAR_VADVANCE ) )
               outline->points[j].y += delta_y;
-
-            else if ( j == ( n_points - 0 )        &&
-                      !( face->variation_support &
-                         TT_FACE_FLAG_VAR_TSB    ) )
-              outline->points[j].y += delta_y;
           }
 
 #ifdef FT_DEBUG_LEVEL_TRACE
           FT_Pos  delta_y = points_out[j].y - points_org[j].y;
 
 
-          outline->points[j].x += delta_x;
-          outline->points[j].y += delta_y;
+          if ( j < n_points - 4 )
+          {
+            outline->points[j].x += delta_x;
+            outline->points[j].y += delta_y;
+          }
+          else
+          {
+            /* To avoid double adjustment of advance width or height, */
+            /* adjust phantom points only if there is no HVAR or VVAR */
+            /* support, respectively.                                 */
+            if ( j == ( n_points - 4 )        &&
+                 !( face->variation_support &
+                    TT_FACE_FLAG_VAR_LSB    ) )
+              outline->points[j].x += delta_x;
+
+            else if ( j == ( n_points - 3 )          &&
+                      !( face->variation_support   &
+                         TT_FACE_FLAG_VAR_HADVANCE ) )
+              outline->points[j].x += delta_x;
+
+            else if ( j == ( n_points - 2 )        &&
+                      !( face->variation_support &
+                         TT_FACE_FLAG_VAR_TSB    ) )
+              outline->points[j].y += delta_y;
+
+            else if ( j == ( n_points - 1 )          &&
+                      !( face->variation_support   &
+                         TT_FACE_FLAG_VAR_VADVANCE ) )
+              outline->points[j].y += delta_y;
+          }
 
 #ifdef FT_DEBUG_LEVEL_TRACE
           if ( delta_x || delta_y )
index 7e81719..a37bb90 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType GX Font Variation loader (specification)                    */
 /*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
+/*  Copyright 2004-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, Werner Lemberg and George Williams.      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -27,6 +27,8 @@
 FT_BEGIN_HEADER
 
 
+#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
+
   /*************************************************************************/
   /*                                                                       */
   /* <Struct>                                                              */
@@ -402,6 +404,10 @@ FT_BEGIN_HEADER
                      FT_Fixed*  coords );
 
   FT_LOCAL( FT_Error )
+  TT_Set_Named_Instance( TT_Face  face,
+                         FT_UInt  instance_index );
+
+  FT_LOCAL( FT_Error )
   tt_face_vary_cvt( TT_Face    face,
                     FT_Stream  stream );
 
@@ -435,6 +441,8 @@ FT_BEGIN_HEADER
   FT_LOCAL( void )
   tt_done_blend( TT_Face  face );
 
+#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
+
 
 FT_END_HEADER
 
index af31408..d855aaa 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType bytecode interpreter (body).                                */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -25,7 +25,7 @@
 #include FT_INTERNAL_CALC_H
 #include FT_TRIGONOMETRY_H
 #include FT_SYSTEM_H
-#include FT_TRUETYPE_DRIVER_H
+#include FT_DRIVER_H
 #include FT_MULTIPLE_MASTERS_H
 
 #include "ttinterp.h"
             TT_INTERPRETER_VERSION_40 )
 #endif
 
-#define PROJECT( v1, v2 )                                                \
-          exc->func_project( exc, (v1)->x - (v2)->x, (v1)->y - (v2)->y )
+#define PROJECT( v1, v2 )                                   \
+          exc->func_project( exc,                           \
+                             SUB_LONG( (v1)->x, (v2)->x ),  \
+                             SUB_LONG( (v1)->y, (v2)->y ) )
 
-#define DUALPROJ( v1, v2 )                                                \
-          exc->func_dualproj( exc, (v1)->x - (v2)->x, (v1)->y - (v2)->y )
+#define DUALPROJ( v1, v2 )                                   \
+          exc->func_dualproj( exc,                           \
+                              SUB_LONG( (v1)->x, (v2)->x ),  \
+                              SUB_LONG( (v1)->y, (v2)->y ) )
 
 #define FAST_PROJECT( v )                          \
           exc->func_project( exc, (v)->x, (v)->y )
       if ( SUBPIXEL_HINTING_INFINALITY                            &&
            ( !exc->ignore_x_mode                                ||
              ( exc->sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) )
-        zone->cur[point].x += FT_MulDiv( distance, v, exc->F_dot_P );
+        zone->cur[point].x = ADD_LONG( zone->cur[point].x,
+                                       FT_MulDiv( distance,
+                                                  v,
+                                                  exc->F_dot_P ) );
       else
 #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
       /* diagonal moves, but only post-IUP.  DejaVu tries to adjust */
       /* diagonal stems like on `Z' and `z' post-IUP.               */
       if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility )
-        zone->cur[point].x += FT_MulDiv( distance, v, exc->F_dot_P );
+        zone->cur[point].x = ADD_LONG( zone->cur[point].x,
+                                       FT_MulDiv( distance,
+                                                  v,
+                                                  exc->F_dot_P ) );
       else
 #endif
 
       if ( NO_SUBPIXEL_HINTING )
-        zone->cur[point].x += FT_MulDiv( distance, v, exc->F_dot_P );
+        zone->cur[point].x = ADD_LONG( zone->cur[point].x,
+                                       FT_MulDiv( distance,
+                                                  v,
+                                                  exc->F_dot_P ) );
 
       zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
     }
               exc->iupx_called            &&
               exc->iupy_called            ) )
 #endif
-        zone->cur[point].y += FT_MulDiv( distance, v, exc->F_dot_P );
+        zone->cur[point].y = ADD_LONG( zone->cur[point].y,
+                                       FT_MulDiv( distance,
+                                                  v,
+                                                  exc->F_dot_P ) );
 
       zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
     }
     v = exc->GS.freeVector.x;
 
     if ( v != 0 )
-      zone->org[point].x += FT_MulDiv( distance, v, exc->F_dot_P );
+      zone->org[point].x = ADD_LONG( zone->org[point].x,
+                                     FT_MulDiv( distance,
+                                                v,
+                                                exc->F_dot_P ) );
 
     v = exc->GS.freeVector.y;
 
     if ( v != 0 )
-      zone->org[point].y += FT_MulDiv( distance, v, exc->F_dot_P );
+      zone->org[point].y = ADD_LONG( zone->org[point].y,
+                                     FT_MulDiv( distance,
+                                                v,
+                                                exc->F_dot_P ) );
   }
 
 
   {
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     if ( SUBPIXEL_HINTING_INFINALITY && !exc->ignore_x_mode )
-      zone->cur[point].x += distance;
+      zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance );
     else
 #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
     if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility )
-      zone->cur[point].x += distance;
+      zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance );
     else
 #endif
 
     if ( NO_SUBPIXEL_HINTING )
-      zone->cur[point].x += distance;
+      zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance );
 
     zone->tags[point]  |= FT_CURVE_TAG_TOUCH_X;
   }
             exc->backward_compatibility          &&
             exc->iupx_called && exc->iupy_called ) )
 #endif
-      zone->cur[point].y += distance;
+      zone->cur[point].y = ADD_LONG( zone->cur[point].y, distance );
 
     zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
   }
   {
     FT_UNUSED( exc );
 
-    zone->org[point].x += distance;
+    zone->org[point].x = ADD_LONG( zone->org[point].x, distance );
   }
 
 
   {
     FT_UNUSED( exc );
 
-    zone->org[point].y += distance;
+    zone->org[point].y = ADD_LONG( zone->org[point].y, distance );
   }
 
 
 
     if ( distance >= 0 )
     {
-      val = distance + compensation;
+      val = ADD_LONG( distance, compensation );
       if ( val < 0 )
         val = 0;
     }
     else
     {
-      val = distance - compensation;
+      val = SUB_LONG( distance, compensation );
       if ( val > 0 )
         val = 0;
     }
 
     if ( distance >= 0 )
     {
-      val = FT_PIX_ROUND( distance + compensation );
+      val = FT_PIX_ROUND_LONG( ADD_LONG( distance, compensation ) );
       if ( val < 0 )
         val = 0;
     }
     else
     {
-      val = -FT_PIX_ROUND( compensation - distance );
+      val = NEG_LONG( FT_PIX_ROUND_LONG( SUB_LONG( compensation,
+                                                   distance ) ) );
       if ( val > 0 )
         val = 0;
     }
 
     if ( distance >= 0 )
     {
-      val = FT_PIX_FLOOR( distance + compensation ) + 32;
+      val = ADD_LONG( FT_PIX_FLOOR( ADD_LONG( distance, compensation ) ),
+                      32 );
       if ( val < 0 )
         val = 32;
     }
     else
     {
-      val = -( FT_PIX_FLOOR( compensation - distance ) + 32 );
+      val = NEG_LONG( ADD_LONG( FT_PIX_FLOOR( SUB_LONG( compensation,
+                                                        distance ) ),
+                                32 ) );
       if ( val > 0 )
         val = -32;
     }
 
     if ( distance >= 0 )
     {
-      val = FT_PIX_FLOOR( distance + compensation );
+      val = FT_PIX_FLOOR( ADD_LONG( distance, compensation ) );
       if ( val < 0 )
         val = 0;
     }
     else
     {
-      val = -FT_PIX_FLOOR( compensation - distance );
+      val = NEG_LONG( FT_PIX_FLOOR( SUB_LONG( compensation, distance ) ) );
       if ( val > 0 )
         val = 0;
     }
 
     if ( distance >= 0 )
     {
-      val = FT_PIX_CEIL( distance + compensation );
+      val = FT_PIX_CEIL_LONG( ADD_LONG( distance, compensation ) );
       if ( val < 0 )
         val = 0;
     }
     else
     {
-      val = -FT_PIX_CEIL( compensation - distance );
+      val = NEG_LONG( FT_PIX_CEIL_LONG( SUB_LONG( compensation,
+                                                  distance ) ) );
       if ( val > 0 )
         val = 0;
     }
 
     if ( distance >= 0 )
     {
-      val = FT_PAD_ROUND( distance + compensation, 32 );
+      val = FT_PAD_ROUND_LONG( ADD_LONG( distance, compensation ), 32 );
       if ( val < 0 )
         val = 0;
     }
     else
     {
-      val = -FT_PAD_ROUND( compensation - distance, 32 );
+      val = NEG_LONG( FT_PAD_ROUND_LONG( SUB_LONG( compensation, distance ),
+                                         32 ) );
       if ( val > 0 )
         val = 0;
     }
 
     if ( distance >= 0 )
     {
-      val = ( distance - exc->phase + exc->threshold + compensation ) &
+      val = ADD_LONG( distance,
+                      exc->threshold - exc->phase + compensation ) &
               -exc->period;
       val += exc->phase;
       if ( val < 0 )
     }
     else
     {
-      val = -( ( exc->threshold - exc->phase - distance + compensation ) &
-               -exc->period );
+      val = NEG_LONG( SUB_LONG( exc->threshold - exc->phase + compensation,
+                                distance ) &
+                        -exc->period );
       val -= exc->phase;
       if ( val > 0 )
         val = -exc->phase;
 
     if ( distance >= 0 )
     {
-      val = ( ( distance - exc->phase + exc->threshold + compensation ) /
+      val = ( ADD_LONG( distance,
+                        exc->threshold - exc->phase + compensation ) /
                 exc->period ) * exc->period;
       val += exc->phase;
       if ( val < 0 )
     }
     else
     {
-      val = -( ( ( exc->threshold - exc->phase - distance + compensation ) /
-                   exc->period ) * exc->period );
+      val = NEG_LONG( ( SUB_LONG( exc->threshold - exc->phase + compensation,
+                                  distance ) /
+                          exc->period ) * exc->period );
       val -= exc->phase;
       if ( val > 0 )
         val = -exc->phase;
   static void
   Ins_ADD( FT_Long*  args )
   {
-    args[0] += args[1];
+    args[0] = ADD_LONG( args[0], args[1] );
   }
 
 
   static void
   Ins_SUB( FT_Long*  args )
   {
-    args[0] -= args[1];
+    args[0] = SUB_LONG( args[0], args[1] );
   }
 
 
   static void
   Ins_ABS( FT_Long*  args )
   {
-    args[0] = FT_ABS( args[0] );
+    if ( args[0] < 0 )
+      args[0] = NEG_LONG( args[0] );
   }
 
 
   static void
   Ins_NEG( FT_Long*  args )
   {
-    args[0] = -args[0];
+    args[0] = NEG_LONG( args[0] );
   }
 
 
     p1 = exc->zp1.cur + aIdx2;
     p2 = exc->zp2.cur + aIdx1;
 
-    A = p1->x - p2->x;
-    B = p1->y - p2->y;
+    A = SUB_LONG( p1->x, p2->x );
+    B = SUB_LONG( p1->y, p2->y );
 
     /* If p1 == p2, SPvTL and SFvTL behave the same as */
     /* SPvTCA[X] and SFvTCA[X], respectively.          */
 
     if ( ( opcode & 1 ) != 0 )
     {
-      C =  B;   /* counter clockwise rotation */
-      B =  A;
-      A = -C;
+      C = B;   /* counter clockwise rotation */
+      B = A;
+      A = NEG_LONG( C );
     }
 
     Normalize( A, B, Vec );
 
     K = FAST_PROJECT( &exc->zp2.cur[L] );
 
-    exc->func_move( exc, &exc->zp2, L, args[1] - K );
+    exc->func_move( exc, &exc->zp2, L, SUB_LONG( args[1], K ) );
 
     /* UNDOCUMENTED!  The MS rasterizer does that with */
     /* twilight points (confirmed by Greg Hitchcock)   */
     }
 
     {
-      FT_Vector* v1 = exc->zp1.org + p2;
-      FT_Vector* v2 = exc->zp2.org + p1;
+      FT_Vector*  v1 = exc->zp1.org + p2;
+      FT_Vector*  v2 = exc->zp2.org + p1;
 
 
-      A = v1->x - v2->x;
-      B = v1->y - v2->y;
+      A = SUB_LONG( v1->x, v2->x );
+      B = SUB_LONG( v1->y, v2->y );
 
       /* If v1 == v2, SDPvTL behaves the same as */
       /* SVTCA[X], respectively.                 */
 
     if ( ( opcode & 1 ) != 0 )
     {
-      C =  B;   /* counter clockwise rotation */
-      B =  A;
-      A = -C;
+      C = B;   /* counter clockwise rotation */
+      B = A;
+      A = NEG_LONG( C );
     }
 
     Normalize( A, B, &exc->GS.dualVector );
       FT_Vector*  v2 = exc->zp2.cur + p1;
 
 
-      A = v1->x - v2->x;
-      B = v1->y - v2->y;
+      A = SUB_LONG( v1->x, v2->x );
+      B = SUB_LONG( v1->y, v2->y );
 
       if ( A == 0 && B == 0 )
       {
 
     if ( ( opcode & 1 ) != 0 )
     {
-      C =  B;   /* counter clockwise rotation */
-      B =  A;
-      A = -C;
+      C = B;   /* counter clockwise rotation */
+      B = A;
+      A = NEG_LONG( C );
     }
 
     Normalize( A, B, &exc->GS.projVector );
       if ( !( SUBPIXEL_HINTING_MINIMAL    &&
               exc->backward_compatibility ) )
 #endif
-        exc->zp2.cur[point].x += dx;
+        exc->zp2.cur[point].x = ADD_LONG( exc->zp2.cur[point].x, dx );
 
       if ( touch )
         exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
               exc->iupx_called            &&
               exc->iupy_called            ) )
 #endif
-        exc->zp2.cur[point].y += dy;
+        exc->zp2.cur[point].y = ADD_LONG( exc->zp2.cur[point].y, dy );
 
       if ( touch )
         exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
                    ( B1 & 63 ) != 0                                           &&
                    ( B2 & 63 ) != 0                                           &&
                    B1 != B2                                                   )
-                Move_Zp2_Point( exc, point, -dx, -dy, TRUE );
+                Move_Zp2_Point( exc,
+                                point,
+                                NEG_LONG( dx ),
+                                NEG_LONG( dy ),
+                                TRUE );
             }
           }
           else if ( exc->face->sph_compatibility_mode )
               if ( ( B1 & 63 ) == 0 &&
                    ( B2 & 63 ) != 0 &&
                    B1 != B2         )
-                Move_Zp2_Point( exc, point, 0, -dy, TRUE );
+                Move_Zp2_Point( exc, point, 0, NEG_LONG( dy ), TRUE );
             }
           }
           else if ( exc->sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL )
 
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     /* subpixel hinting - make MSIRP respect CVT cut-in; */
-    if ( SUBPIXEL_HINTING_INFINALITY                         &&
-         exc->ignore_x_mode                                  &&
-         exc->GS.freeVector.x != 0                           &&
-         FT_ABS( distance - args[1] ) >= control_value_cutin )
+    if ( SUBPIXEL_HINTING_INFINALITY                                    &&
+         exc->ignore_x_mode                                             &&
+         exc->GS.freeVector.x != 0                                      &&
+         FT_ABS( SUB_LONG( distance, args[1] ) ) >= control_value_cutin )
       distance = args[1];
 #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
-    exc->func_move( exc, &exc->zp1, point, args[1] - distance );
+    exc->func_move( exc,
+                    &exc->zp1,
+                    point,
+                    SUB_LONG( args[1], distance ) );
 
     exc->GS.rp1 = exc->GS.rp0;
     exc->GS.rp2 = point;
                                     exc->tt_metrics.compensations[0] );
     }
 
-    exc->func_move( exc, &exc->zp0, point, distance - org_dist );
+    exc->func_move( exc, &exc->zp0, point, SUB_LONG( distance, org_dist ) );
 
   Fail:
     exc->GS.rp0 = point;
         FT_Vector  vec;
 
 
-        vec.x = FT_MulFix( vec1->x - vec2->x, exc->metrics.x_scale );
-        vec.y = FT_MulFix( vec1->y - vec2->y, exc->metrics.y_scale );
+        vec.x = FT_MulFix( SUB_LONG( vec1->x, vec2->x ),
+                           exc->metrics.x_scale );
+        vec.y = FT_MulFix( SUB_LONG( vec1->y, vec2->y ),
+                           exc->metrics.y_scale );
 
         org_dist = FAST_DUALPROJ( &vec );
       }
 
     /* single width cut-in test */
 
-    if ( FT_ABS( org_dist - exc->GS.single_width_value ) <
-         exc->GS.single_width_cutin )
+    /* |org_dist - single_width_value| < single_width_cutin */
+    if ( exc->GS.single_width_cutin > 0          &&
+         org_dist < exc->GS.single_width_value +
+                      exc->GS.single_width_cutin &&
+         org_dist > exc->GS.single_width_value -
+                      exc->GS.single_width_cutin )
     {
       if ( org_dist >= 0 )
         org_dist = exc->GS.single_width_value;
       }
       else
       {
-        if ( distance > -minimum_distance )
-          distance = -minimum_distance;
+        if ( distance > NEG_LONG( minimum_distance ) )
+          distance = NEG_LONG( minimum_distance );
       }
     }
 
 
     org_dist = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 );
 
-    exc->func_move( exc, &exc->zp1, point, distance - org_dist );
+    exc->func_move( exc, &exc->zp1, point, SUB_LONG( distance, org_dist ) );
 
   Fail:
     exc->GS.rp1 = exc->GS.rp0;
       }
       else
       {
-        if ( distance > -minimum_distance )
-          distance = -minimum_distance;
+        if ( distance > NEG_LONG( minimum_distance ) )
+          distance = NEG_LONG( minimum_distance );
       }
     }
 
     }
 #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
-    exc->func_move( exc, &exc->zp1, point, distance - cur_dist );
+    exc->func_move( exc,
+                    &exc->zp1,
+                    point,
+                    SUB_LONG( distance, cur_dist ) );
 
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
     if ( SUBPIXEL_HINTING_INFINALITY )
       }
 
       if ( reverse_move )
-        exc->func_move( exc, &exc->zp1, point, -( distance - cur_dist ) );
+        exc->func_move( exc,
+                        &exc->zp1,
+                        point,
+                        SUB_LONG( cur_dist, distance ) );
     }
 
 #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
         distance = PROJECT( exc->zp1.cur + point,
                             exc->zp0.cur + exc->GS.rp0 );
 
-        exc->func_move( exc, &exc->zp1, point, -distance );
+        exc->func_move( exc, &exc->zp1, point, NEG_LONG( distance ) );
       }
 
       exc->GS.loop--;
 
     /* Cramer's rule */
 
-    dbx = exc->zp0.cur[b1].x - exc->zp0.cur[b0].x;
-    dby = exc->zp0.cur[b1].y - exc->zp0.cur[b0].y;
+    dbx = SUB_LONG( exc->zp0.cur[b1].x, exc->zp0.cur[b0].x );
+    dby = SUB_LONG( exc->zp0.cur[b1].y, exc->zp0.cur[b0].y );
 
-    dax = exc->zp1.cur[a1].x - exc->zp1.cur[a0].x;
-    day = exc->zp1.cur[a1].y - exc->zp1.cur[a0].y;
+    dax = SUB_LONG( exc->zp1.cur[a1].x, exc->zp1.cur[a0].x );
+    day = SUB_LONG( exc->zp1.cur[a1].y, exc->zp1.cur[a0].y );
 
-    dx = exc->zp0.cur[b0].x - exc->zp1.cur[a0].x;
-    dy = exc->zp0.cur[b0].y - exc->zp1.cur[a0].y;
+    dx = SUB_LONG( exc->zp0.cur[b0].x, exc->zp1.cur[a0].x );
+    dy = SUB_LONG( exc->zp0.cur[b0].y, exc->zp1.cur[a0].y );
 
-    discriminant = FT_MulDiv( dax, -dby, 0x40 ) +
-                   FT_MulDiv( day, dbx, 0x40 );
-    dotproduct   = FT_MulDiv( dax, dbx, 0x40 ) +
-                   FT_MulDiv( day, dby, 0x40 );
+    discriminant = ADD_LONG( FT_MulDiv( dax, NEG_LONG( dby ), 0x40 ),
+                             FT_MulDiv( day, dbx, 0x40 ) );
+    dotproduct   = ADD_LONG( FT_MulDiv( dax, dbx, 0x40 ),
+                             FT_MulDiv( day, dby, 0x40 ) );
 
     /* The discriminant above is actually a cross product of vectors     */
     /* da and db. Together with the dot product, they can be used as     */
     /*       discriminant = |da||db|sin(angle)     .                     */
     /* We use these equations to reject grazing intersections by         */
     /* thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. */
-    if ( 19 * FT_ABS( discriminant ) > FT_ABS( dotproduct ) )
+    if ( MUL_LONG( 19, FT_ABS( discriminant ) ) > FT_ABS( dotproduct ) )
     {
-      val = FT_MulDiv( dx, -dby, 0x40 ) + FT_MulDiv( dy, dbx, 0x40 );
+      val = ADD_LONG( FT_MulDiv( dx, NEG_LONG( dby ), 0x40 ),
+                      FT_MulDiv( dy, dbx, 0x40 ) );
 
       R.x = FT_MulDiv( val, dax, discriminant );
       R.y = FT_MulDiv( val, day, discriminant );
 
       /* XXX: Block in backward_compatibility and/or post-IUP? */
-      exc->zp2.cur[point].x = exc->zp1.cur[a0].x + R.x;
-      exc->zp2.cur[point].y = exc->zp1.cur[a0].y + R.y;
+      exc->zp2.cur[point].x = ADD_LONG( exc->zp1.cur[a0].x, R.x );
+      exc->zp2.cur[point].y = ADD_LONG( exc->zp1.cur[a0].y, R.y );
     }
     else
     {
       /* else, take the middle of the middles of A and B */
 
       /* XXX: Block in backward_compatibility and/or post-IUP? */
-      exc->zp2.cur[point].x = ( exc->zp1.cur[a0].x +
-                                exc->zp1.cur[a1].x +
-                                exc->zp0.cur[b0].x +
-                                exc->zp0.cur[b1].x ) / 4;
-      exc->zp2.cur[point].y = ( exc->zp1.cur[a0].y +
-                                exc->zp1.cur[a1].y +
-                                exc->zp0.cur[b0].y +
-                                exc->zp0.cur[b1].y ) / 4;
+      exc->zp2.cur[point].x =
+        ADD_LONG( ADD_LONG( exc->zp1.cur[a0].x, exc->zp1.cur[a1].x ),
+                  ADD_LONG( exc->zp0.cur[b0].x, exc->zp0.cur[b1].x ) ) / 4;
+      exc->zp2.cur[point].y =
+        ADD_LONG( ADD_LONG( exc->zp1.cur[a0].y, exc->zp1.cur[a1].y ),
+                  ADD_LONG( exc->zp0.cur[b0].y, exc->zp0.cur[b1].y ) ) / 4;
     }
 
     exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH;
     distance = PROJECT( exc->zp0.cur + p2, exc->zp1.cur + p1 ) / 2;
 
     exc->func_move( exc, &exc->zp1, p1, distance );
-    exc->func_move( exc, &exc->zp0, p2, -distance );
+    exc->func_move( exc, &exc->zp0, p2, NEG_LONG( distance ) );
   }
 
 
         FT_Vector  vec;
 
 
-        vec.x = FT_MulFix( exc->zp1.orus[exc->GS.rp2].x - orus_base->x,
+        vec.x = FT_MulFix( SUB_LONG( exc->zp1.orus[exc->GS.rp2].x,
+                                     orus_base->x ),
                            exc->metrics.x_scale );
-        vec.y = FT_MulFix( exc->zp1.orus[exc->GS.rp2].y - orus_base->y,
+        vec.y = FT_MulFix( SUB_LONG( exc->zp1.orus[exc->GS.rp2].y,
+                                     orus_base->y ),
                            exc->metrics.y_scale );
 
         old_range = FAST_DUALPROJ( &vec );
         FT_Vector  vec;
 
 
-        vec.x = FT_MulFix( exc->zp2.orus[point].x - orus_base->x,
+        vec.x = FT_MulFix( SUB_LONG( exc->zp2.orus[point].x,
+                                     orus_base->x ),
                            exc->metrics.x_scale );
-        vec.y = FT_MulFix( exc->zp2.orus[point].y - orus_base->y,
+        vec.y = FT_MulFix( SUB_LONG( exc->zp2.orus[point].y,
+                                     orus_base->y ),
                            exc->metrics.y_scale );
 
         org_dist = FAST_DUALPROJ( &vec );
       exc->func_move( exc,
                       &exc->zp2,
                       (FT_UShort)point,
-                      new_dist - cur_dist );
+                      SUB_LONG( new_dist, cur_dist ) );
     }
 
   Fail:
     FT_F26Dot6  dx;
 
 
-    dx = worker->curs[p].x - worker->orgs[p].x;
+    dx = SUB_LONG( worker->curs[p].x, worker->orgs[p].x );
     if ( dx != 0 )
     {
       for ( i = p1; i < p; i++ )
-        worker->curs[i].x += dx;
+        worker->curs[i].x = ADD_LONG( worker->curs[i].x, dx );
 
       for ( i = p + 1; i <= p2; i++ )
-        worker->curs[i].x += dx;
+        worker->curs[i].x = ADD_LONG( worker->curs[i].x, dx );
     }
   }
 
     org2   = worker->orgs[ref2].x;
     cur1   = worker->curs[ref1].x;
     cur2   = worker->curs[ref2].x;
-    delta1 = cur1 - org1;
-    delta2 = cur2 - org2;
+    delta1 = SUB_LONG( cur1, org1 );
+    delta2 = SUB_LONG( cur2, org2 );
 
     if ( cur1 == cur2 || orus1 == orus2 )
     {
 
 
         if ( x <= org1 )
-          x += delta1;
+          x = ADD_LONG( x, delta1 );
 
         else if ( x >= org2 )
-          x += delta2;
+          x = ADD_LONG( x, delta2 );
 
         else
           x = cur1;
 
 
         if ( x <= org1 )
-          x += delta1;
+          x = ADD_LONG( x, delta1 );
 
         else if ( x >= org2 )
-          x += delta2;
+          x = ADD_LONG( x, delta2 );
 
         else
         {
           if ( !scale_valid )
           {
             scale_valid = 1;
-            scale       = FT_DivFix( cur2 - cur1, orus2 - orus1 );
+            scale       = FT_DivFix( SUB_LONG( cur2, cur1 ),
+                                     SUB_LONG( orus2, orus1 ) );
           }
 
-          x = cur1 + FT_MulFix( worker->orus[i].x - orus1, scale );
+          x = ADD_LONG( cur1,
+                        FT_MulFix( SUB_LONG( worker->orus[i].x, orus1 ),
+                                   scale ) );
         }
         worker->curs[i].x = x;
       }
                          SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) &&
                        ( B1 & 63 ) != 0                           &&
                        ( B2 & 63 ) != 0                           ) ) )
-                exc->func_move( exc, &exc->zp0, A, -B );
+                exc->func_move( exc, &exc->zp0, A, NEG_LONG( B ) );
             }
           }
           else
       K |= 1 << 12;
 
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    if ( SUBPIXEL_HINTING_MINIMAL )
+    /* Toggle the following flags only outside of monochrome mode.      */
+    /* Otherwise, instructions may behave weirdly and rendering results */
+    /* may differ between v35 and v40 mode, e.g., in `Times New Roman   */
+    /* Bold Italic'. */
+    if ( SUBPIXEL_HINTING_MINIMAL && exc->subpixel_hinting_lean )
     {
       /********************************/
       /* HINTING FOR SUBPIXEL         */
       /*                              */
       /* The only smoothing method FreeType supports unless someone sets */
       /* FT_LOAD_TARGET_MONO.                                            */
-      if ( ( args[0] & 2048 ) != 0 )
+      if ( ( args[0] & 2048 ) != 0 && exc->subpixel_hinting_lean )
         K |= 1 << 18;
 
       /********************************/
 #endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
 
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    /* Toggle backward compatibility according to what font says, except   */
-    /* when it's a `tricky' font that heavily relies on the interpreter to */
-    /* render glyphs correctly, e.g. DFKai-SB.  Backward compatibility     */
-    /* hacks may break it.                                                 */
+    /*
+     *  Toggle backward compatibility according to what font wants, except
+     *  when
+     *
+     *  1) we have a `tricky' font that heavily relies on the interpreter to
+     *     render glyphs correctly, for example DFKai-SB, or
+     *  2) FT_RENDER_MODE_MONO (i.e, monochome rendering) is requested.
+     *
+     *  In those cases, backward compatibility needs to be turned off to get
+     *  correct rendering.  The rendering is then completely up to the
+     *  font's programming.
+     *
+     */
     if ( SUBPIXEL_HINTING_MINIMAL          &&
+         exc->subpixel_hinting_lean        &&
          !FT_IS_TRICKY( &exc->face->root ) )
       exc->backward_compatibility = !( exc->GS.instruct_control & 4 );
     else
                                   FT_MAX( 50,
                                           exc->cvtSize / 10 );
     else
-      exc->loopcall_counter_max = FT_MAX( 100,
-                                          10 * exc->cvtSize );
+      exc->loopcall_counter_max = 300 + 8 * exc->cvtSize;
 
     /* as a protection against an unreasonable number of CVT entries  */
     /* we assume at most 100 control values per glyph for the counter */
     } while ( !exc->instruction_trap );
 
   LNo_Error_:
-    FT_TRACE4(( "  %d instructions executed\n", ins_counter ));
+    FT_TRACE4(( "  %d instruction%s executed\n",
+                ins_counter == 1 ? "" : "s",
+                ins_counter ));
     return FT_Err_Ok;
 
   LErrorCodeOverflow_:
index 55e4720..2966439 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType bytecode interpreter (specification).                       */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -253,23 +253,38 @@ FT_BEGIN_HEADER
 
 #ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
     /*
-     * Modern TrueType fonts are usually rendered through Microsoft's
-     * collection of rendering techniques called ClearType (e.g., subpixel
-     * rendering and subpixel hinting).  When ClearType was introduced, most
-     * fonts were not ready.  Microsoft decided to implement a backward
-     * compatibility mode that employed several simple to complicated
-     * assumptions and tricks that modified the interpretation of the
-     * bytecode contained in these fonts to make them look ClearType-y
-     * somehow.  Most (web)fonts that were released since then have come to
-     * rely on these hacks to render correctly, even some of Microsoft's
-     * flagship ClearType fonts (Calibri, Cambria, Segoe UI).
+     * FreeType supports ClearType-like hinting of TrueType fonts through
+     * the version 40 interpreter.  This is achieved through several hacks
+     * in the base (v35) interpreter, as detailed below.
      *
-     * The minimal subpixel hinting code (interpreter version 40) employs a
-     * small list of font-agnostic hacks to bludgeon non-native-ClearType
-     * fonts (except tricky ones[1]) into submission.  It will not try to
-     * toggle hacks for specific fonts for performance and complexity
-     * reasons.  The focus is on modern (web)fonts rather than legacy fonts
-     * that were made for black-and-white rendering.
+     * ClearType is an umbrella term for several rendering techniques
+     * employed by Microsoft's various GUI and rendering toolkit
+     * implementations, most importantly: subpixel rendering for using the
+     * RGB subpixels of LCDs to approximately triple the perceived
+     * resolution on the x-axis and subpixel hinting for positioning stems
+     * on subpixel borders.  TrueType programming is explicit, i.e., fonts
+     * must be programmed to take advantage of ClearType's possibilities.
+     *
+     * When ClearType was introduced, it seemed unlikely that all fonts
+     * would be reprogrammed, so Microsoft decided to implement a backward
+     * compatibility mode.  It employs several simple to complicated
+     * assumptions and tricks, many of them font-dependent, that modify the
+     * interpretation of the bytecode contained in these fonts to retrofit
+     * them into a ClearType-y look.  The quality of the results varies.
+     * Most (web)fonts that were released since then have come to rely on
+     * these hacks to render correctly, even some of Microsoft's flagship
+     * fonts (e.g., Calibri, Cambria, Segoe UI).
+     *
+     * FreeType's minimal subpixel hinting code (interpreter version 40)
+     * employs a small list of font-agnostic hacks loosely based on the
+     * public information available on Microsoft's compatibility mode[2].
+     * The focus is on modern (web)fonts rather than legacy fonts that were
+     * made for monochrome rendering.  It will not match ClearType rendering
+     * exactly.  Unlike the `Infinality' code (interpreter version 38) that
+     * came before, it will not try to toggle hacks for specific fonts for
+     * performance and complexity reasons.  It will fall back to version 35
+     * behavior for tricky fonts[1] or when monochrome rendering is
+     * requested.
      *
      * Major hacks
      *
@@ -347,7 +362,8 @@ FT_BEGIN_HEADER
      *
      */
 
-    /* Using v40 implies subpixel hinting.  Used to detect interpreter */
+    /* Using v40 implies subpixel hinting, unless FT_RENDER_MODE_MONO has been
+     * requested.  Used to detect interpreter */
     /* version switches.  `_lean' to differentiate from the Infinality */
     /* `subpixel_hinting', which is managed differently.               */
     FT_Bool            subpixel_hinting_lean;
index 4db0f28..bc8086f 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Objects manager (body).                                              */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -21,7 +21,7 @@
 #include FT_INTERNAL_STREAM_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_INTERNAL_SFNT_H
-#include FT_TRUETYPE_DRIVER_H
+#include FT_DRIVER_H
 
 #include "ttgload.h"
 #include "ttpload.h"
   {
 
 #define TRICK_NAMES_MAX_CHARACTERS  19
-#define TRICK_NAMES_COUNT           18
+#define TRICK_NAMES_COUNT           23
 
     static const char trick_names[TRICK_NAMES_COUNT]
                                  [TRICK_NAMES_MAX_CHARACTERS + 1] =
 
       "cpop",               /* dftt-p7.ttf; version 1.00, 1992 [DLJGyShoMedium] */
       "DFGirl-W6-WIN-BF",   /* dftt-h6.ttf; version 1.00, 1993 */
+      "DFGothic-EB",        /* DynaLab Inc. 1992-1995 */
+      "DFGyoSho-Lt",        /* DynaLab Inc. 1992-1995 */
+      "DFHSGothic-W5",      /* DynaLab Inc. 1992-1995 */
+      "DFHSMincho-W3",      /* DynaLab Inc. 1992-1995 */
+      "DFHSMincho-W7",      /* DynaLab Inc. 1992-1995 */
       "DFKaiSho-SB",        /* dfkaisb.ttf */
       "DFKaiShu",
       "DFKai-SB",           /* kaiu.ttf; version 3.00, 1998 [DFKaiShu-SB-Estd-BF] */
   tt_check_trickyness_sfnt_ids( TT_Face  face )
   {
 #define TRICK_SFNT_IDS_PER_FACE   3
-#define TRICK_SFNT_IDS_NUM_FACES  19
+#define TRICK_SFNT_IDS_NUM_FACES  26
 
     static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES]
                                        [TRICK_SFNT_IDS_PER_FACE] = {
         { 0x28233BF1UL, 0x000087C4UL }, /* fpgm */
         { 0xA344A1EBUL, 0x000001E1UL }  /* prep */
       },
+      { /* DFGothic-EB */
+        { 0x12C3EBB2UL, 0x00000350UL }, /* cvt  */
+        { 0xB680EE64UL, 0x000087A7UL }, /* fpgm */
+        { 0xCE939563UL, 0x00000758UL }  /* prep */
+      },
+      { /* DFGyoSho-Lt */
+        { 0x11E5EAD4UL, 0x00000350UL }, /* cvt  */
+        { 0xCE5956E9UL, 0x0000BC85UL }, /* fpgm */
+        { 0x8272F416UL, 0x00000045UL }  /* prep */
+      },
+      { /* DFHSGothic-W5 */
+        { 0x1262EB4EUL, 0x00000350UL }, /* cvt  */
+        { 0xE86A5D64UL, 0x00007940UL }, /* fpgm */
+        { 0x7850F729UL, 0x000005FFUL }  /* prep */
+      },
+      { /* DFHSMincho-W3 */
+        { 0x122DEB0AUL, 0x00000350UL }, /* cvt  */
+        { 0x3D16328AUL, 0x0000859BUL }, /* fpgm */
+        { 0xA93FC33BUL, 0x000002CBUL }  /* prep */
+      },
+      { /* DFHSMincho-W7 */
+        { 0x125FEB26UL, 0x00000350UL }, /* cvt  */
+        { 0xA5ACC982UL, 0x00007EE1UL }, /* fpgm */
+        { 0x90999196UL, 0x0000041FUL }  /* prep */
+      },
       { /* DFKaiShu */
         { 0x11E5EAD4UL, 0x00000350UL }, /* cvt  */
         { 0x5A30CA3BUL, 0x00009063UL }, /* fpgm */
         { 0xA6E78C01UL, 0x00008998UL }, /* fpgm */
         { 0x13A42602UL, 0x0000007EUL }  /* prep */
       },
+      { /* DLCLiShu */
+        { 0x07DCF546UL, 0x00000308UL }, /* cvt  */
+        { 0x40FE7C90UL, 0x00008E2AUL }, /* fpgm */
+        { 0x608174B5UL, 0x0000007AUL }  /* prep */
+      },
+      { /* DLCHayBold */
+        { 0xEB891238UL, 0x00000308UL }, /* cvt  */
+        { 0xD2E4DCD4UL, 0x0000676FUL }, /* fpgm */
+        { 0x8EA5F293UL, 0x000003B8UL }  /* prep */
+      },
       { /* HuaTianKaiTi */
         { 0xFFFBFFFCUL, 0x00000008UL }, /* cvt  */
         { 0x9C9E48B8UL, 0x0000BEA2UL }, /* fpgm */
     /* 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 */
+    if ( face->format_tag != 0x00010000L  && /* MS fonts                             */
+         face->format_tag != 0x00020000L  && /* CJK fonts for Win 3.1                */
+         face->format_tag != TTAG_true    && /* Mac fonts                            */
+         face->format_tag != TTAG_0xA5kbd && /* `Keyboard.dfont' (legacy Mac OS X)   */
+         face->format_tag != TTAG_0xA5lst )  /* `LastResort.dfont' (legacy Mac OS X) */
     {
       FT_TRACE2(( "  not a TTF font\n" ));
       goto Bad_Format;
 #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
 
     {
-      FT_Int  instance_index = face_index >> 16;
+      FT_UInt  instance_index = (FT_UInt)face_index >> 16;
 
 
       if ( FT_HAS_MULTIPLE_MASTERS( ttface ) &&
            instance_index > 0                )
       {
-        error = TT_Get_MM_Var( face, NULL );
+        error = TT_Set_Named_Instance( face, instance_index );
         if ( error )
           goto Exit;
 
-        if ( face->blend->mmvar->namedstyle )
-        {
-          FT_Memory  memory = ttface->memory;
-
-          FT_Var_Named_Style*  named_style;
-          FT_String*           style_name;
-
-
-          /* in `face_index', the instance index starts with value 1 */
-          named_style = face->blend->mmvar->namedstyle + instance_index - 1;
-          error = sfnt->get_name( face,
-                                  (FT_UShort)named_style->strid,
-                                  &style_name );
-          if ( error )
-            goto Exit;
-
-          /* set style name; if already set, replace it */
-          if ( face->root.style_name )
-            FT_FREE( face->root.style_name );
-          face->root.style_name = style_name;
-
-          /* finally, select the named instance */
-          error = TT_Set_Var_Design( face,
-                                     face->blend->mmvar->num_axis,
-                                     named_style->coords );
-          if ( error )
-            goto Exit;
-
-          tt_apply_mvar( face );
-        }
+        tt_apply_mvar( face );
       }
     }
 
   /* <Input>                                                               */
   /*    size        :: A handle to the target size object.                 */
   /*                                                                       */
-  /*    only_height :: Only recompute ascender, descender, and height.     */
+  /*    only_height :: Only recompute ascender, descender, and height;     */
+  /*                   this flag is used for variation fonts where         */
+  /*                   `tt_size_reset' is used as an iterator function.    */
   /*                                                                       */
   FT_LOCAL_DEF( FT_Error )
   tt_size_reset( TT_Size  size,
     size->ttmetrics.valid = TRUE;
 
     if ( only_height )
+    {
+      /* we must not recompute the scaling values here since       */
+      /* `tt_size_reset' was already called (with only_height = 0) */
       return FT_Err_Ok;
+    }
 
     if ( face->header.Flags & 8 )
     {
index cdacee7..38fa30e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Objects manager (specification).                                     */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 66bd7e1..cdbb806 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for truetype module. */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 1410cd7..df878ae 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    The FreeType position independent code services for truetype module. */
 /*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
+/*  Copyright 2009-2018 by                                                 */
 /*  Oran Agra and Mickey Gabel.                                            */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 70ac15d..d9526ad 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType-specific tables loader (body).                              */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
     if ( pos2 > face->glyf_len )
     {
       /* We try to sanitize the last `loca' entry. */
-      if ( gindex == face->num_locations - 1 )
+      if ( gindex == face->num_locations - 2 )
       {
         FT_TRACE1(( "tt_face_get_location:"
-                    " too large offset (0x%08lx) found for glyph index %ld,\n"
+                    " too large size (%ld bytes) found for glyph index %ld,\n"
                     "                     "
-                    " truncating at the end of `glyf' table (0x%08lx)\n",
-                    pos2, gindex + 1, face->glyf_len ));
+                    " truncating at the end of `glyf' table to %ld bytes\n",
+                    pos2 - pos1, gindex, face->glyf_len - pos1 ));
         pos2 = face->glyf_len;
       }
       else
index 79079f3..fa12527 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType-specific tables loader (specification).                     */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 1c8cf01..d94bcc8 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType Subpixel Hinting.                                           */
 /*                                                                         */
-/*  Copyright 2010-2017 by                                                 */
+/*  Copyright 2010-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -22,7 +22,7 @@
 #include FT_INTERNAL_SFNT_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_OUTLINE_H
-#include FT_TRUETYPE_DRIVER_H
+#include FT_DRIVER_H
 
 #include "ttsubpix.h"
 
 
 
     /* Does font name match rule family? */
-    if ( strcmp( detected_font_name, rule_font_name ) == 0 )
+    if ( ft_strcmp( detected_font_name, rule_font_name ) == 0 )
       return TRUE;
 
     /* Is font name a wildcard ""? */
-    if ( strcmp( rule_font_name, "" ) == 0 )
+    if ( ft_strcmp( rule_font_name, "" ) == 0 )
       return TRUE;
 
     /* Is font name contained in a class list? */
     for ( i = 0; i < FAMILY_CLASS_RULES_SIZE; i++ )
     {
-      if ( strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 )
+      if ( ft_strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 )
       {
         for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
         {
-          if ( strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 )
+          if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 )
             continue;
-          if ( strcmp( FAMILY_CLASS_Rules[i].member[j],
-                       detected_font_name ) == 0 )
+          if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j],
+                          detected_font_name ) == 0 )
             return TRUE;
         }
       }
 
 
     /* Does font style match rule style? */
-    if ( strcmp( detected_font_style, rule_font_style ) == 0 )
+    if ( ft_strcmp( detected_font_style, rule_font_style ) == 0 )
       return TRUE;
 
     /* Is font style a wildcard ""? */
-    if ( strcmp( rule_font_style, "" ) == 0 )
+    if ( ft_strcmp( rule_font_style, "" ) == 0 )
       return TRUE;
 
     /* Is font style contained in a class list? */
     for ( i = 0; i < STYLE_CLASS_RULES_SIZE; i++ )
     {
-      if ( strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 )
+      if ( ft_strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 )
       {
         for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
         {
-          if ( strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 )
+          if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 )
             continue;
-          if ( strcmp( STYLE_CLASS_Rules[i].member[j],
-                       detected_font_style ) == 0 )
+          if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j],
+                          detected_font_style ) == 0 )
             return TRUE;
         }
       }
index c68f97f..1070bb0 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    TrueType Subpixel Hinting.                                           */
 /*                                                                         */
-/*  Copyright 2010-2017 by                                                 */
+/*  Copyright 2010-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 6c10a31..b94b7d0 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/type1 Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index f299d6f..3fea5cc 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 97bef28..cb1a142 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 11a2646..61053d9 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    AFM support for Type 1 fonts (body).                                 */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 9f62cd0..cb8d302 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    AFM support for Type 1 fonts (specification).                        */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index c208994..029b410 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 driver interface (body).                                      */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -30,6 +30,8 @@
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_STREAM_H
 #include FT_INTERNAL_HASH_H
+#include FT_INTERNAL_POSTSCRIPT_PROPS_H
+#include FT_DRIVER_H
 
 #include FT_SERVICE_MULTIPLE_MASTERS_H
 #include FT_SERVICE_GLYPH_DICT_H
@@ -37,6 +39,7 @@
 #include FT_SERVICE_POSTSCRIPT_NAME_H
 #include FT_SERVICE_POSTSCRIPT_CMAPS_H
 #include FT_SERVICE_POSTSCRIPT_INFO_H
+#include FT_SERVICE_PROPERTIES_H
 #include FT_SERVICE_KERNING_H
 
 
     (FT_Get_MM_Var_Func)    T1_Get_MM_Var,         /* get_mm_var     */
     (FT_Set_Var_Design_Func)T1_Set_Var_Design,     /* set_var_design */
     (FT_Get_Var_Design_Func)T1_Get_Var_Design,     /* get_var_design */
+    (FT_Set_Instance_Func)  T1_Reset_MM_Blend,     /* set_instance   */
 
     (FT_Get_Var_Blend_Func) NULL,                  /* get_var_blend  */
     (FT_Done_Blend_Func)    T1_Done_Blend          /* done_blend     */
 
 
   /*
+   *  PROPERTY SERVICE
+   *
+   */
+
+  FT_DEFINE_SERVICE_PROPERTIESREC(
+    t1_service_properties,
+
+    (FT_Properties_SetFunc)ps_property_set,      /* set_property */
+    (FT_Properties_GetFunc)ps_property_get )     /* get_property */
+
+
+  /*
    *  SERVICE LIST
    *
    */
     { FT_SERVICE_ID_GLYPH_DICT,           &t1_service_glyph_dict },
     { FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_TYPE_1 },
     { FT_SERVICE_ID_POSTSCRIPT_INFO,      &t1_service_ps_info },
+    { FT_SERVICE_ID_PROPERTIES,           &t1_service_properties },
 
 #ifndef T1_CONFIG_OPTION_NO_AFM
     { FT_SERVICE_ID_KERNING,              &t1_service_kerning },
       FT_MODULE_DRIVER_SCALABLE   |
       FT_MODULE_DRIVER_HAS_HINTER,
 
-      sizeof ( FT_DriverRec ),
+      sizeof ( PS_DriverRec ),
 
       "type1",
       0x10000L,
index 2927864..2b15072 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level Type 1 driver interface (specification).                  */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 492dbb4..9e0151b 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 error codes (specification only).                             */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index aaf19b6..87d40e7 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 Glyph Loader (body).                                          */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -23,6 +23,8 @@
 #include FT_INTERNAL_STREAM_H
 #include FT_OUTLINE_H
 #include FT_INTERNAL_POSTSCRIPT_AUX_H
+#include FT_INTERNAL_CFF_TYPES_H
+#include FT_DRIVER_H
 
 #include "t1errors.h"
 
 #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.                                         *********/
-  /**********                                                      *********/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
   static FT_Error
   T1_Parse_Glyph_And_Get_Char_String( T1_Decoder  decoder,
                                       FT_UInt     glyph_index,
-                                      FT_Data*    char_string )
+                                      FT_Data*    char_string,
+                                      FT_Bool*    force_scaling )
   {
     T1_Face   face  = (T1_Face)decoder->builder.face;
     T1_Font   type1 = &face->type1;
     FT_Error  error = FT_Err_Ok;
 
+    PSAux_Service           psaux         = (PSAux_Service)face->psaux;
+    const T1_Decoder_Funcs  decoder_funcs = psaux->t1_decoder_funcs;
+    PS_Decoder              psdecoder;
+
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
     FT_Incremental_InterfaceRec *inc =
                       face->root.internal->incremental_interface;
 #endif
 
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+    PS_Driver  driver = (PS_Driver)FT_FACE_DRIVER( face );
+#endif
 
     decoder->font_matrix = type1->font_matrix;
     decoder->font_offset = type1->font_offset;
     }
 
     if ( !error )
-      error = decoder->funcs.parse_charstrings(
-                decoder, (FT_Byte*)char_string->pointer,
-                (FT_UInt)char_string->length );
+    {
+      /* choose which renderer to use */
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+      if ( driver->hinting_engine == FT_HINTING_FREETYPE ||
+           decoder->builder.metrics_only                 )
+        error = decoder_funcs->parse_charstrings_old(
+                  decoder,
+                  (FT_Byte*)char_string->pointer,
+                  (FT_UInt)char_string->length );
+#else
+      if ( decoder->builder.metrics_only )
+        error = decoder_funcs->parse_metrics(
+                  decoder,
+                  (FT_Byte*)char_string->pointer,
+                  (FT_UInt)char_string->length );
+#endif
+      else
+      {
+        CFF_SubFontRec  subfont;
+
+
+        psaux->ps_decoder_init( &psdecoder, decoder, TRUE );
+
+        psaux->t1_make_subfont( FT_FACE( face ),
+                                &face->type1.private_dict, &subfont );
+        psdecoder.current_subfont = &subfont;
+
+        error = decoder_funcs->parse_charstrings(
+                  &psdecoder,
+                  (FT_Byte*)char_string->pointer,
+                  (FT_ULong)char_string->length );
+
+        /* Adobe's engine uses 16.16 numbers everywhere;              */
+        /* as a consequence, glyphs larger than 2000ppem get rejected */
+        if ( FT_ERR_EQ( error, Glyph_Too_Big ) )
+        {
+          /* this time, we retry unhinted and scale up the glyph later on */
+          /* (the engine uses and sets the hardcoded value 0x10000 / 64 = */
+          /* 0x400 for both `x_scale' and `y_scale' in this case)         */
+          ((T1_GlyphSlot)decoder->builder.glyph)->hint = FALSE;
+
+          *force_scaling = TRUE;
+
+          error = decoder_funcs->parse_charstrings(
+                    &psdecoder,
+                    (FT_Byte*)char_string->pointer,
+                    (FT_ULong)char_string->length );
+        }
+      }
+    }
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
 
                   FT_UInt     glyph_index )
   {
     FT_Data   glyph_data;
-    FT_Error  error = T1_Parse_Glyph_And_Get_Char_String(
-                        decoder, glyph_index, &glyph_data );
+    FT_Bool   force_scaling = FALSE;
+    FT_Error  error         = T1_Parse_Glyph_And_Get_Char_String(
+                                decoder, glyph_index, &glyph_data,
+                                &force_scaling );
 
 
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
   }
 
 
+  /*************************************************************************/
+  /*************************************************************************/
+  /*************************************************************************/
+  /**********                                                      *********/
+  /**********            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_Compute_Max_Advance( T1_Face  face,
                           FT_Pos*  max_advance )
     T1_DecoderRec           decoder;
     T1_Face                 face = (T1_Face)t1glyph->face;
     FT_Bool                 hinting;
+    FT_Bool                 scaled;
+    FT_Bool                 force_scaling = FALSE;
     T1_Font                 type1         = &face->type1;
     PSAux_Service           psaux         = (PSAux_Service)face->psaux;
     const T1_Decoder_Funcs  decoder_funcs = psaux->t1_decoder_funcs;
 
     hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&
                        ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
+    scaled  = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 );
 
+    glyph->hint     = hinting;
+    glyph->scaled   = scaled;
     t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
 
     error = decoder_funcs->init( &decoder,
 
     /* now load the unscaled outline */
     error = T1_Parse_Glyph_And_Get_Char_String( &decoder, glyph_index,
-                                                &glyph_data );
+                                                &glyph_data,
+                                                &force_scaling );
     if ( error )
       goto Exit;
 #ifdef FT_CONFIG_OPTION_INCREMENTAL
     glyph_data_loaded = 1;
 #endif
 
+    hinting     = glyph->hint;
     font_matrix = decoder.font_matrix;
     font_offset = decoder.font_offset;
 
         }
 #endif
 
-        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
+        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling )
         {
           /* scale the outline and the metrics */
           FT_Int       n;
index cc4d5e7..72ef76f 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 Glyph Loader (specification).                                 */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index f5c661f..2b8d489 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 font loader (body).                                           */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
     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].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 */
   }
 
 
-  FT_LOCAL_DEF( FT_Error )
-  T1_Set_MM_Blend( T1_Face    face,
+  static FT_Error
+  t1_set_mm_blend( T1_Face    face,
                    FT_UInt    num_coords,
                    FT_Fixed*  coords )
   {
     PS_Blend  blend = face->blend;
     FT_UInt   n, m;
 
+    FT_Bool  have_diff = 0;
+
 
     if ( !blend )
       return FT_THROW( Invalid_Argument );
 
         result = FT_MulFix( result, factor );
       }
-      blend->weight_vector[n] = result;
+
+      if ( blend->weight_vector[n] != result )
+      {
+        blend->weight_vector[n] = result;
+        have_diff               = 1;
+      }
     }
 
+    /* return value -1 indicates `no change' */
+    return have_diff ? FT_Err_Ok : -1;
+  }
+
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Set_MM_Blend( T1_Face    face,
+                   FT_UInt    num_coords,
+                   FT_Fixed*  coords )
+  {
+    FT_Error  error;
+
+
+    error = t1_set_mm_blend( face, num_coords, coords );
+    if ( error )
+      return error;
+
+    if ( num_coords )
+      face->root.face_flags |= FT_FACE_FLAG_VARIATION;
+    else
+      face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
+
     return FT_Err_Ok;
   }
 
                     FT_UInt   num_coords,
                     FT_Long*  coords )
   {
+    FT_Error  error;
     PS_Blend  blend = face->blend;
     FT_UInt   n, p;
     FT_Fixed  final_blends[T1_MAX_MM_DESIGNS];
       final_blends[n] = the_blend;
     }
 
-    return T1_Set_MM_Blend( face, blend->num_axis, final_blends );
+    error = t1_set_mm_blend( face, blend->num_axis, final_blends );
+    if ( error )
+      return error;
+
+    if ( num_coords )
+      face->root.face_flags |= FT_FACE_FLAG_VARIATION;
+    else
+      face->root.face_flags &= ~FT_FACE_FLAG_VARIATION;
+
+    return FT_Err_Ok;
+  }
+
+
+  /* MM fonts don't have named instances, so only the design is reset */
+
+  FT_LOCAL_DEF( FT_Error )
+  T1_Reset_MM_Blend( T1_Face  face,
+                     FT_UInt  instance_index )
+  {
+    FT_UNUSED( instance_index );
+
+    return T1_Set_MM_Blend( face, 0, NULL );
   }
 
 
     if ( ft_isdigit( *cur ) || *cur == '[' )
     {
       T1_Encoding  encode          = &face->type1.encoding;
-      FT_Int       count, n;
+      FT_Int       count, array_size, n;
       PS_Table     char_table      = &loader->encoding_table;
       FT_Memory    memory          = parser->root.memory;
       FT_Error     error;
       else
         count = (FT_Int)T1_ToInt( parser );
 
-      /* only composite fonts (which we don't support) */
-      /* can have larger values                        */
+      array_size = count;
       if ( count > 256 )
       {
-        FT_ERROR(( "parse_encoding: invalid encoding array size\n" ));
-        parser->root.error = FT_THROW( Invalid_File_Format );
-        return;
+        FT_TRACE2(( "parse_encoding:"
+                    " only using first 256 encoding array entries\n" ));
+        array_size = 256;
       }
 
       T1_Skip_Spaces( parser );
       }
 
       /* 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 )     ||
+      loader->num_chars = encode->num_chars = array_size;
+      if ( FT_NEW_ARRAY( encode->char_index, array_size )     ||
+           FT_NEW_ARRAY( encode->char_name,  array_size )     ||
            FT_SET_ERROR( psaux->ps_table_funcs->init(
-                           char_table, count, memory ) ) )
+                           char_table, array_size, memory ) ) )
       {
         parser->root.error = error;
         return;
       }
 
       /* We need to `zero' out encoding_table.elements */
-      for ( n = 0; n < count; n++ )
+      for ( n = 0; n < array_size; n++ )
       {
         char*  notdef = (char *)".notdef";
 
 
             len = (FT_UInt)( 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';
+            if ( n < array_size )
+            {
+              parser->root.error = T1_Add_Table( char_table, charcode,
+                                                 cur, len + 1 );
+              if ( parser->root.error )
+                return;
+              char_table->elements[charcode][len] = '\0';
+            }
 
             n++;
           }
index 2d86984..03be3f7 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 font loader (specification).                                  */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -90,6 +90,10 @@ FT_BEGIN_HEADER
                     FT_Long*  coords );
 
   FT_LOCAL( FT_Error )
+  T1_Reset_MM_Blend( T1_Face  face,
+                     FT_UInt  instance_index );
+
+  FT_LOCAL( FT_Error )
   T1_Get_Var_Design( T1_Face    face,
                      FT_UInt    num_coords,
                      FT_Fixed*  coords );
index 97c16b0..7333c4c 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 objects manager (body).                                       */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -21,6 +21,7 @@
 #include FT_INTERNAL_DEBUG_H
 #include FT_INTERNAL_STREAM_H
 #include FT_TRUETYPE_IDS_H
+#include FT_DRIVER_H
 
 #include "t1gload.h"
 #include "t1load.h"
       /* 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 */
+      /*   https://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!                 */
 
         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
       }
     }
 
   /*    FreeType error code.  0 means success.                             */
   /*                                                                       */
   FT_LOCAL_DEF( FT_Error )
-  T1_Driver_Init( FT_Module  driver )
+  T1_Driver_Init( FT_Module  module )
   {
-    FT_UNUSED( driver );
+    PS_Driver  driver = (PS_Driver)module;
+
+    FT_UInt32  seed;
+
+
+    /* set default property values, cf. `ftt1drv.h' */
+#ifdef T1_CONFIG_OPTION_OLD_ENGINE
+    driver->hinting_engine = FT_HINTING_FREETYPE;
+#else
+    driver->hinting_engine = FT_HINTING_ADOBE;
+#endif
+
+    driver->no_stem_darkening = TRUE;
+
+    driver->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1;
+    driver->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1;
+    driver->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2;
+    driver->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2;
+    driver->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3;
+    driver->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3;
+    driver->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4;
+    driver->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4;
+
+    /* compute random seed from some memory addresses */
+    seed = (FT_UInt32)( (FT_Offset)(char*)&seed          ^
+                        (FT_Offset)(char*)&module        ^
+                        (FT_Offset)(char*)module->memory );
+    seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 );
+
+    driver->random_seed = (FT_Int32)seed;
+    if ( driver->random_seed < 0 )
+      driver->random_seed = -driver->random_seed;
+    else if ( driver->random_seed == 0 )
+      driver->random_seed = 123456789;
 
     return FT_Err_Ok;
   }
index 39d26bf..8298e03 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 objects manager (specification).                              */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
@@ -120,12 +120,12 @@ FT_BEGIN_HEADER
     FT_Bool          hint;
     FT_Bool          scaled;
 
-    FT_Int           max_points;
-    FT_Int           max_contours;
-
     FT_Fixed         x_scale;
     FT_Fixed         y_scale;
 
+    FT_Int           max_points;
+    FT_Int           max_contours;
+
   } T1_GlyphSlotRec;
 
 
index 18dd264..8e201e5 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 parser (body).                                                */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 3396680..4ac82ae 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 parser (specification).                                       */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index ca0c55f..43a65d8 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 1 tokenizer (specification).                                    */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 8179537..72eff59 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Type 1 driver component (body only).                        */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index b826bbc..b98de05 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/type42 Jamfile
 #
-# Copyright 2002-2017 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 2f52806..3d4732b 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2002-2017 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index d7e8965..9325d38 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 2002-2017 by
+# Copyright 2002-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 366cfb3..f579b27 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level Type 42 driver interface (body).                          */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  Roberto Alameda.                                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 1ac4a0a..3667f3e 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    High-level Type 42 driver interface (specification).                 */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  Roberto Alameda.                                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index fda92ab..e3978a7 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 42 error codes (specification only).                            */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 87e5206..66e5c40 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 42 objects manager (body).                                      */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  Roberto Alameda.                                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
 
         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:
index eb4c5bf..3bad513 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 42 objects manager (specification).                             */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  Roberto Alameda.                                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index e7c6770..4813d1f 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 42 font parser (body).                                          */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  Roberto Alameda.                                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 7a68606..f35d23d 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 42 font parser (specification).                                 */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  Roberto Alameda.                                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 2306ab6..d0aa2de 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Type 42 font data types (specification only).                        */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  Roberto Alameda.                                                       */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index ae8ac26..6a89cfb 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType Type 42 driver component.                                   */
 /*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
+/*  Copyright 2002-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index 52aa7f9..4385e3b 100644 (file)
@@ -1,6 +1,6 @@
 # FreeType 2 src/winfonts Jamfile
 #
-# Copyright 2001-2017 by
+# Copyright 2001-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 4251021..3a86af5 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    Win FNT/FON error codes (specification only).                        */
 /*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
+/*  Copyright 2001-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*                                                                         */
 /*  This file is part of the FreeType project, and may only be used,       */
index ffc53a1..13f9077 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 73e825d..d694d1a 100644 (file)
@@ -3,7 +3,7 @@
 #
 
 
-# Copyright 1996-2017 by
+# Copyright 1996-2018 by
 # David Turner, Robert Wilhelm, and Werner Lemberg.
 #
 # This file is part of the FreeType project, and may only be used, modified,
index 9811fbb..36bd314 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType font driver for Windows FNT/FON files                       */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*  Copyright 2003 Huw D M Davies for Codeweavers                          */
 /*  Copyright 2007 Dmitry Timoshkov for Codeweavers                        */
                              NULL );
         if ( error )
           goto Fail;
-
-        /* Select default charmap */
-        if ( root->num_charmaps )
-          root->charmap = root->charmaps[0];
       }
 
       /* set up remaining flags */
 
       /* 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 ) )
+      if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, pitch ) )
         goto Exit;
 
       column = (FT_Byte*)bitmap->buffer;
index 884b645..4885c9d 100644 (file)
@@ -4,7 +4,7 @@
 /*                                                                         */
 /*    FreeType font driver for Windows FNT/FON files                       */
 /*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
+/*  Copyright 1996-2018 by                                                 */
 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
 /*  Copyright 2007 Dmitry Timoshkov for Codeweavers                        */
 /*                                                                         */
index ea56318..6222c5e 100644 (file)
@@ -1,6 +1,6 @@
-$! make Freetype2 under OpenVMS
+$! make FreeType 2 under OpenVMS
 $!
-$! Copyright 2003-2017 by
+$! Copyright 2003-2018 by
 $! David Turner, Robert Wilhelm, and Werner Lemberg.
 $!
 $! This file is part of the FreeType project, and may only be used, modified,
@@ -10,7 +10,7 @@ $! indicate that you have read the license and understand and accept it
 $! fully.
 $!
 $!
-$! External libraries (like Freetype, XPM, etc.) are supported via the
+$! 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
 $!
@@ -26,12 +26,12 @@ $! 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
+$! Make procedure history for FreeType 2
 $!
 $!------------------------------------------------------------------------------
 $! Version history
 $! 0.01 20040401 First version to receive a number
-$! 0.02 20041030 Add error handling, Freetype 2.1.9
+$! 0.02 20041030 Add error handling, FreeType 2.1.9
 $!
 $ on error then goto err_exit
 $ true  = 1
@@ -128,7 +128,7 @@ $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"
+$ write sys$output "Could not locate FreeType 2 include files"
 $ goto err_exit
 $ERR_EXIT:
 $ set message/facil/ident/sever/text
@@ -1070,7 +1070,7 @@ $ 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
+! check if external libraries (like t1lib and FreeType) are available on
 ! the system.
 !
 ! Layout of the file:
@@ -1148,7 +1148,7 @@ $ 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
+$! Nasty hack to get the FreeType includes to work
 $!
 $ ft2def = false
 $ if ((libname .eqs. "FREETYPE") .and. -